2011-02-08 3 views
0

Я новичок в написании сценариев bash, и я учился, когда я занимаюсь небольшим проектом, который я принимаю. Тем не менее, я столкнулся с проблемой, с которой я, похоже, не справился.Замена команды Bash переменной

У меня есть переменная, которую мне нужно включить в команду. При запуске непосредственно в оболочке (с введенной переменной вручную) команда возвращает ожидаемый результат. Однако я не могу заставить его работать при использовании переменной.

Итак, если я вручную запускаю это, он правильно возвращает 0 или 1, в зависимости от того, работает он или нет.

ps -ef | grep -v grep | grep -c ProcessName 

Однако, когда я пытаюсь вставить, что в этот пункт в то время, он всегда принимает значение 0, потому что он не ищет правильный текст.

while [ `ps -ef | grep -v grep | grep -c {$1}` -ne 0 ] 
do 
    sleep 5 
done 

Есть ли способ, которым я могу это сделать? Я пробовал множество разных вещей безрезультатно. Я также попытался использовать синтаксис $() для подстановки команд, но мне тоже не повезло.

Спасибо!

+1

Почему у вас есть брекеты в тесте while, но не в вашем примере? А $ 1 имеет правильное значение? – Cascabel

+0

Я поставил фигурные скобки в цикле while, потому что я думал, что я нуждаюсь в них там, чтобы обозначить переменную. Это может быть неверно, но удаление их не разрешает проблему для меня. И да, $ 1 имеет правильное значение. Я добавил 'echo $ 1' прямо перед оператором while, и это правильно. – grt3kl

+0

Если вам нужно использовать фигурные скобки, знак доллара идет до открытия, и также неплохо процитировать его: '' $ {1} "'. Для получения полезной информации см. [Управление процессами] (http://mywiki.wooledge.org/ProcessManagement). –

ответ

3

Я думаю, что вместо {$1} вы имеете в виду "$1". Кроме того, вы можете просто сделать pgrep -c "$1" вместо двух труб.

Кроме того, нет необходимости сравнивать вывод grep -c с 0, так как вы можете просто увидеть, была ли команда неудачной или нет. Таким образом, значительно упрощенная версия может быть:

while pgrep "$1" > /dev/null 
do 
    sleep 4 
done 
+0

Я заменил '{$ 1}' '' '$ 1" ', но это тоже не работает. Я собираюсь просмотреть это, чтобы убедиться, что у меня что-то не хватает ... – grt3kl

+0

@ grt3kl: Извините, я понял, что вы пытаетесь сделать не так - теперь я понимаю, что вы пытаетесь спать в то время как определенный процесс работает, а не спать до его начала. Итак, я изменил пример с 'до pgrep '$ 1" 'на' while pgrep "$ 1", что, безусловно, работает для меня здесь. –

+0

Можете ли вы объяснить, что означает 'pgrep '$ 1">/dev/null'? Собственно, я понимаю это, кроме арифметического сравнения. Если бы я хотел сделать противоположное (т. Е. Спать, пока определенный процесс не работает), будет ли это просто «pgrep» $ 1 «<=/dev/null» или что-то совсем другое? – grt3kl

1

Вы должны действительно использовать -C с ps, а не грязных труб, если вы используете полное имя процесса. Если вас интересует подстрока, то ваш путь - единственное, о чем я могу думать.

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