为什么:
#!/bin/bash
wtf=false
if [ $wtf ] || [ ! -f filethatexists.whatever ]
then
echo "WTF1"
fi
if [ ! -f filethatexists.whatever ]
then
echo "WTF2"
fi打印:
WTF1
而不是什么都不做?尤其令人困惑的是,第二种形式的工作方式与预期的一样,而第一种形式则不然。
发布于 2010-09-27 06:55:23
基本测试
[ $wtf ]测试中间的字符串是否为空。
因为$wtf包含字符串'false',所以测试返回true,如果成功,则返回退出状态0,因为'false'与空字符串''不同-因此您将获得WTF1作为响应。
尝试使用:
wtf=''正如Gordon Davisson (和Dennis Williamson)所指出的,谨慎对待正在测试的字符串是一个好主意。实际上,我应该说明我总是使用[ -n "$wtf" ]或[ -z "$wtf" ]来测试是否设置了变量,因为在25年前我还在学习shell时,这是必要的。我从Bash的爱好者那里得到了一些相反的故事,他们说在Bash中你不必担心它--然而,我认为这里的代码提供了一个反例,实际上你仍然需要担心它。
因此,以下是一些最佳实践:
[[ $wtf ]],它知道如何处理-n或-z测试的变量,以测试非空或空值。这些规则可能会有例外--但遵循它们不会错得太远。
考虑下面的代码:
wtf="1 -eq 0"
[ $wtf ] && echo "WTF0"
[[ $wtf ]] && echo "WTF1"
wtf="false"
[ $wtf ] && echo "WTF2"
[[ $wtf ]] && echo "WTF3"
wtf=""
[ $wtf ] && echo "WTF4"
[[ $wtf ]] && echo "WTF5"
wtf="false"
[ "$wtf" ] && echo "WTF6"
[[ "$wtf" ]] && echo "WTF7"
wtf=""
[ "$wtf" ] && echo "WTF8"
[[ "$wtf" ]] && echo "WTF9"这会产生以下结果:
WTF1
WTF2
WTF3
WTF6
WTF7同时使用bash和ksh (当使用'bash testcode.sh‘或'ksh testcode.sh’运行时,可以在MacOS X 10.6.4上找到)。一个真正的Bourne shell (如果你仍然可以找到这样的东西)会反对双括号操作-它将无法在$PATH上找到命令'[[‘。
您可以扩展测试以涵盖更多令人反胃的情况。
发布于 2010-09-27 07:40:46
这里有一个很方便的小技巧:
wtf=false
if $wtf || [ ! -f filethatexists.whatever ]在这种形式下,执行变量的内容,返回值决定测试是通过还是失败。碰巧true和false都是返回适当值的Bash内置函数。
发布于 2010-09-27 06:58:02
if [ $wtf = true ] || [ ! -f . .
https://stackoverflow.com/questions/3800158
复制相似问题