【问题标题】:Bash shell 'if' statement comparing outputs from different commandsBash shell 'if' 语句比较不同命令的输出
【发布时间】:2011-12-12 15:10:26
【问题描述】:

使用经过调整的example given to me by Sam Ruby,以便展示我想要实现的目标。

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 

【问题讨论】:

  • 你注意到 Sam Ruby 说过“空格很重要”吗?

标签: linux bash shell if-statement grep


【解决方案1】:

您需要在前面加上 $: 来引用表达式的值:

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

【讨论】:

    【解决方案2】:

    至少在其他 shell 中,您需要更加小心使用空格;方括号是命令名称,需要与前后单词分开。您还需要(再次在经典 shell 中)将变量嵌入双引号中:

    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
    

    更新: 添加了一些额外的引号。也可以引用作业:

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

    不会造成任何伤害; bash 不是绝对必要的(但对于古老的 Bourne shell 可能是必需的)。

    【讨论】:

    • 您还应该在$(somecommand) 位周围加上双引号,至少在if 语句中(将它们分配给变量时没有必要,但我倾向于这样做以保持一致性)。
    • 我倾向于引用它们;我受到了谴责,因为它并不总是必要的,我正在努力减轻压力。也许我不应该打扰。我很想访问一个真正的 Bourne shell 来测试更多新的 bash 行为与旧行为。我将添加双引号 - 谢谢。
    • 例如,经典 shell 包括 System V Bourne shell(和 System III 或第 7 版版本),也可能包括 Korn shell。 Bash 将是一个现代 shell。
    猜你喜欢
    • 2020-09-08
    • 1970-01-01
    • 2017-02-06
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多