【发布时间】:2021-05-31 09:39:04
【问题描述】:
我正在重构我的脚本并尝试将所有if cmd; then fi; 语句转换为if [[cmd]]; then fi。我知道如何通过调用上一行中的命令并在当前行中使用其退出代码来转换它,但我想知道如何内联。
例子:
# I have this
if grep "some-string" some_file.txt > /dev/null; then
echo "non zero exit status"
fi
# I know how to do this
$(grep "some-string" some_file.txt > /dev/null)
if [[ $? -ne 0 ]]; then
echo "non zero exit status"
fi
# I want to know how to do something like this?
if [[ grep "some-string" some_file > dev/null ]]; then
echo "non zero exit status"
fi
请告诉我如何内联执行和检查if [[...]]; then fi 语句中的命令的状态码?
【问题讨论】:
-
不要。您现在拥有的
if grep ...版本是正确且惯用的。[[ ]]用于测试条件表达式,而不是查看命令是否成功(除非您将命令的退出状态存储在变量中,在这种情况下,您需要条件表达式来检查值变量)。 -
什么?!
[[ grep ...没有任何意义。if grep ...是正确的方法。该样式指南的哪一部分让您认为需要对其进行重构? -
(OT:重构代码需要删除
> /dev/null并添加-q。) -
@Biffen this part in the style guide 让我感到困惑。我在使用 shell 时并不精通 shell 脚本。不过,grep 的
-q标志很有帮助。 -
@rsampaths16 该部分不适用于命令的退出代码。它只是说使用
[[而不是test(以及其他调用test的方式,例如[)。您没有使用test,因此该规则不适用。
标签: bash