2011-10-21 51 views
2

使用改编的example given to me by Sam Ruby,我已经调整过,所以我可以显示我想要实现的内容。Bash shell'if'语句比较来自不同命令的输出

app1=$(someapp -flag | grep usefulstuff | cut -c 5-10) 
if [$app1 = (someapptwo -flag | grep usefulstuff | cut -c 20-25)]; then 
mkdir IPFolder-1 
elif ...blah blah 
fi 

我可以像上面显示的那样使用grep,还是我吠叫错误的树?还是应该让它看起来略有些事情是这样的:

app1=$(someapp -flag | grep usefulstuff | cut -c 5-10) 
app2=$(someapptwo -flag | grep usefulstuff | cut -c 20-25) 
if [$app1 = $app2]; then 
mkdir IPFolder-1 
elif ...blah blah 
fi 
+0

你有没有注意到Sam Ruby说“空间很重要”? –

回答

2

您需要参考您的表达式的值前面加上一个$:

... 
if [ "$app1" = "$(someapptwo -flag | grep usefulstuff | cut -c 20-25)" ]; then 
... 
7

至少在其他炮弹,你需要对空间更加谨慎;方括号是命令名称,需要与前面和后面的单词分开。您还需要(再经典贝壳某些)嵌入在双引号中的变量:

app1=$(someapp -flag | grep usefulstuff | cut -c 5-10) 
if [ "$app1" = "$(someapptwo -flag | grep usefulstuff | cut -c 20-25)" ] 
then mkdir IPFolder-1 
elif ...blah blah 
then : do this instead... 
fi 

你可以做到这一切在同一行(当然,二是因为我避免了水平滚动条只要有可能):

if [ "$(someapp -flag | grep usefulstuff | cut -c 5-10)" = \ 
    "$(someapptwo -flag | grep usefulstuff | cut -c 20-25)" ] 
then mkdir IPFolder-1 
elif ...blah blah 
then : do this instead... 
fi 

或者你可以有两个单独的命令捕获做到这一点:

app1=$(someapp -flag | grep usefulstuff | cut -c 5-10) 
app2=$(someapptwo -flag | grep usefulstuff | cut -c 20-25) 
if [ "$app1" = "$app2" ] 
then mkdir IPFolder-1 
elif ...blah blah 
then : do this instead... 
fi 

更新: 一些电子添加了xtra引号。也可以引用作业:

app1="$(someapp -flag | grep usefulstuff | cut -c 5-10)" 

不会造成伤害;这对bash来说不是必须的(但它可能对于古老的Bourne shell来说是必需的)。

+1

你应该在'$(somecommand)'位周围加双引号,至少在'if'语句中(把它们分配给一个变量时没有必要,但为了一致性,我倾向于这样做)。 –

+0

我倾向于引用他们;我受到惩罚,因为它并不总是必要的,我试图减轻压力。也许我不应该打扰。我希望能够访问真正的Bourne shell来测试更多新的bash行为与传统行为。我将添加双引号 - 谢谢。 –

+0

+1好答案。经典shell的意思是什么? – milancurcic