2011-02-08 143 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而不是凌乱的管道。如果您对子字符串匹配感兴趣,那么您的方式是我能想到的唯一方法。