为什么:
#!/bin/bash
wtf=false
if [ $wtf ] || [ ! -f filethatexists.whatever ]
then
echo "WTF1"
fi
if [ ! -f filethatexists.whatever ]
then
echo "WTF2"
fi
打印:
WTF1
而不是什么?特别令人困惑的是,第二种形式按预期工作,而第一种形式没有。
为什么:
#!/bin/bash
wtf=false
if [ $wtf ] || [ ! -f filethatexists.whatever ]
then
echo "WTF1"
fi
if [ ! -f filethatexists.whatever ]
then
echo "WTF2"
fi
打印:
WTF1
而不是什么?特别令人困惑的是,第二种形式按预期工作,而第一种形式没有。
基本测试
[ $wtf ]
测试中间的字符串是否为空。
以来 $wtf
包含字符串 'false'
,测试返回true,或退出状态0表示成功,因为 'false'
与空字符串不同 ''
- 因此你得到了 WTF1
作为回应。
试试:
wtf=''
正如所指出的那样 戈登戴维森 (和 丹尼斯威廉姆森),小心你正在测试的字符串是个好主意。的确,我应该说我会一直使用 [ -n "$wtf" ]
要么 [ -z "$wtf" ]
测试是否设置了一个变量,因为在我学习shell的时候,这是四分之一世纪以前的必要条件。我有来自Bash afficionados的反故事,你不必在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(在MacOS X 10.6.4上找到,使用'bash testcode.sh'或'ksh testcode.sh'运行时)。一个真正的Bourne shell(如果你仍然可以找到这样的东西)会反对双括号操作 - 它将无法找到命令'[[
' 上 $PATH
。
您可以扩展测试以覆盖更多令人作呕的案例。
基本测试
[ $wtf ]
测试中间的字符串是否为空。
以来 $wtf
包含字符串 'false'
,测试返回true,或退出状态0表示成功,因为 'false'
与空字符串不同 ''
- 因此你得到了 WTF1
作为回应。
试试:
wtf=''
正如所指出的那样 戈登戴维森 (和 丹尼斯威廉姆森),小心你正在测试的字符串是个好主意。的确,我应该说我会一直使用 [ -n "$wtf" ]
要么 [ -z "$wtf" ]
测试是否设置了一个变量,因为在我学习shell的时候,这是四分之一世纪以前的必要条件。我有来自Bash afficionados的反故事,你不必在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(在MacOS X 10.6.4上找到,使用'bash testcode.sh'或'ksh testcode.sh'运行时)。一个真正的Bourne shell(如果你仍然可以找到这样的东西)会反对双括号操作 - 它将无法找到命令'[[
' 上 $PATH
。
您可以扩展测试以覆盖更多令人作呕的案例。
这是一个方便的小技巧:
wtf=false
if $wtf || [ ! -f filethatexists.whatever ]
在这种形式中,执行变量的内容,返回值确定测试是通过还是失败。它发生了 true
和 false
是Bash builtins,返回适当的值。
if [ $wtf = true ] || [ ! -f . .