【问题标题】:Executing code in if-statement (Bash)在 if 语句中执行代码 (Bash)
【发布时间】:2011-05-30 18:26:00
【问题描述】:

新问题:

我不能这样做(错误:line 2: [: ==: unary operator expected):

if [ $(echo "") == "" ]
then
    echo "Success!"
fi

但这很好用:

tmp=$(echo "")
if [ "$tmp" == "" ]
then
    echo "Success!"
fi

为什么?

原问题:

是否可以在 if 语句中获取命令的结果?

我想做这样的事情:

if [ $(echo "foo") == "foo" ]
then
    echo "Success!"
fi

我目前使用这个解决方法:

tmp=$(echo "foo")
if [ "$tmp" == "foo" ]
then
    echo "Success!"
fi

【问题讨论】:

  • 这个:if [ $(echo "foo") == "foo" ]; then echo "Success!"; fi
  • 抱歉,真正的问题是我不能这样做:if [ $(echo "") == "" ]; then echo "Success!"; fi

标签: bash if-statement


【解决方案1】:

简短的回答是——您可以在if 条件内评估命令。在您的第一个示例中,我唯一要更改的是引用:

if [ "$(echo foo)" == "foo" ]
then 
    echo "Success"'!'
fi
  • 注意'!' 的有趣引用。这会在交互式 bash 会话中禁用 ! 的特殊行为,这可能会给您带来意想不到的结果。

更新后您的问题变得清晰,引用的更改实际上解决了它:

$(...) 的求值发生在if [...] 的求值之前,因此如果$(...) 求值为空字符串,则[...] 变为if [ == ""],这是非法的语法。

解决这个问题的方法是在$(...) 表达式之外加上引号。这是您可能会遇到在引用中引用的棘手问题的地方,但我将把这个问题放在另一个问题上。

【讨论】:

  • 我刚刚测试了这段代码,它仍然启动了新的shell。退出 shell 后,成功打印出来。使用 GNU bash 4.1.5
  • 如果我需要使用一个需要我转义其中的变量的命令怎么办?示例str="123 456 789"; if [ "$(someCommand $str)" == "foo" ]; then echo "Success!"; fi 和 someCommand 只检查第一个参数
  • :(我的错,我在脚本开始时不小心启动了新的 bash。一切正常。:D
  • @Tyilo,用双引号引用可以评估$str,因此您的示例应该可以工作,但保留空格可能是一个更棘手的问题:例如如果str="123 456 789"(注意“123”和“456”之间的2个空格),在这种情况下你可能想试试"$(someCommand "$str")"
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多