【发布时间】:2021-11-12 05:15:24
【问题描述】:
我很困惑:
echo "i-am-sure-this-is-here" > /tmp/myfile
if [[ $(grep -q sure /tmp/myfile) ]] ; then echo "Found!" ; else echo "wtf! not found" ; fi
这给出了:
wtf! not found
所以我尝试了一些更简单的方法:
if [[ true ]] ; then echo "true -> expected" ; else echo "true -> unexpected" ; fi
if [[ false ]] ; then echo "false -> unexpected" ; else echo "false -> expected" ; fi
这给了我一些意想不到的东西:
true -> expected
false -> unexpected
我显然不明白这一点。一些问题:
- 为什么
false是真的? - 是否有条件评估命令的退出代码?我预计
0退出代码表示true(true命令的返回代码),任何非0退出代码表示false(false命令返回1)李>
如何在bash 中评估if-else-fi 构造中的命令的退出代码,而不必返回到显式地将退出代码($?) 与预期值进行比较,这是丑陋且不可读的?
我知道这会奏效:
grep -q sure /tmp/myfile
if [[ $? -eq 0 ]] ; then echo "Found!" ; else echo "wtf! not found" ; fi
但这更长(2 行而不是 1 行),而且更丑。
【问题讨论】:
-
[[ <something> ]]如果<something>不是空字符串,则为真。grep -q不打印任何内容,因此[[ $(grep -q …) ]]将始终为 false。[[ false ]]是真的,因为false这个词对 Bash 没有任何“意义”,它不是一个空字符串。要使用grep作为条件,只需使用if grep -q …; then …。 -
但这更长(2 行而不是 1 行),而且更丑:更长更丑:是的。至于行数,这取决于你。如果您愿意,可以将整个 bash 脚本写成一行。实际上,我也会将
if语句分散到 6 行以提高可读性,而不是将其压缩成一行,但这是个人喜好问题。 -
您应该使用基本的
test或[内置插件。
标签: bash if-statement subprocess