2015-03-03 2 views
0

Оператор «if», который отвечает за проверку работы приложения, не работает. Это всегда возвращает «ложь» Вот script.sh:Проверьте, работает ли приложение через bash в сценарии оболочки

#!/bin/bash 
    osascript -e "do shell script \" 

     if (ps aux | grep "[[S]kype]" > /dev/null) 
     then 
      echo "RUNNING" > /Users/someuser/Desktop/RUNNING.txt 
     else 
      echo "STOPPED" > /Users/someuser/Desktop/STOPPED.txt 
     fi 

    \" with administrator privileges" 

В результате сценарий создает «STOPPED.txt», даже если приложение запускается.

Как решить следующую проблему?

Обратите внимание, что я могу изменить только оператор «IF».

+1

Try заставляя его работать без osascript сначала –

+0

@ совет thatotherguy также хорош: во-первых, сделайте линию ps работать в командной строке; только когда вы это понимаете, если вы сложите его в оператор * if *. –

ответ

1

Здесь есть пара проблем. Вы не укажете его в своем сообщении, но вы, похоже, смотрите конкретно на приложение «Skype». Квадратные скобки, однако, имеют особое значение в grep: они означают любой из закрытых символов. Но, вложив квадратные скобки, вы в основном гарантируете, что он ничего не будет соответствовать. (См. Grep ambiguity nested square bracket в другом месте.)

Именно поэтому он всегда сообщает «остановлен», потому что ничего не соответствует.

Вы, вероятно, хотите что-то больше похоже:

ps aux | grep "Skype" 

Однако, если вы запустите это, вы обнаружите, что, вместо этого, он сообщает, как всегда работает. Это потому, что это фактически соответствует самой grep, так как grep-процесс также содержит нужный текст. Чтобы исправить эту проблему, вам нужно как-то удалить процесс grep из списка совпадений. (Это может быть, что ваши квадратные скобки были для, см комментариев.) Один из способов заключается в использовании grep -v, чтобы исключить строки, которые соответствуют:

ps aux | grep "Skype" | grep -v "grep" 

Это должно делать то, что вы хотите. Я тестировал его с упрощенной формой вашего сценария и правильно сообщается, было ли названо приложение работает или не работает:

#!/bin/bash 
osascript -e "do shell script \" 

    if (ps aux | grep Skype | grep -v grep > /dev/null) 
    then 
     echo RUNNING 
    else 
     echo STOPPED 
    fi 

\"" 

Обратите внимание, что в то время как я упростил остальную часть вашего сценария, чтобы сделать его легче проверить, важным изменение находится только в заявлении if.

(Заметим также, что, поскольку ваши поиски не содержат пробелы, кавычки вокруг поисков излишни.. Вы можете улучшить читаемость, удаляя их это не повредит сценарий, чтобы иметь их, однако)

+3

Легче, чем 'grep" Skype "| grep -v "grep" 'использовать regex для пропуска grep:' grep '[S] kype ". Это будет соответствовать любому «S» рядом с «k», но не квадратным скобкам в команде grep. – vastlysuperiorman

Смежные вопросы