2011-02-08 142 views
0

我是bash腳本編程新手,我一直在學習,因爲我正在做一個小型項目。但是,我遇到了一個我似乎無法逾越的問題。Bash命令替換變量

我有一個變量,我需要包含在一個命令中。當直接在shell中運行(手動鍵入變量)時,該命令返回預期結果。但是,使用變量時我無法使其工作。

因此,如果我手動運行此,它正確返回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 2011-02-08 16:53:10

+0

我把大括號放在while循環中,因爲我認爲我需要它們來表示變量。這可能不正確,但刪除它們並不能解決我的問題。是的,$ 1有正確的價值。我在while語句之前添加了`echo $ 1`,它是正確的。 – grt3kl 2011-02-08 17:08:45

回答

3

我認爲,而不是{$1}你的意思是"$1"。此外,你可以做pgrep -c "$1"而不是兩個管道。

此外,也不需要將grep -c的輸出與0進行比較,因爲您只能看到該命令是否失敗。因此,一個更加簡化的版本可能是:

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

如果你使用全過程的名稱應該要使用-Cps而不是凌亂的管道。如果您對子字符串匹配感興趣,那麼您的方式是我能想到的唯一方法。