我试图弄清楚为什么bash"错误行为":
REG=true
VIN=false
if $REG -a $VIN; then
echo $REG $VIN
fi
运行时,它会产生:
$ bash test.sh
true false
我什么都没想到,你能展示如何对这两个变量进行完整的评估吗?
在REG=true
中,'true' 是一个字符串。当您执行$REG
时,您正在执行命令true
。
if $REG -a $VIN
的意思是"使用选项'-a'和参数'$VIN'运行命令true
,这些选项被true忽略。所以这就像你有if true
一样.
if $REG && $VIN
导致执行"真"和"假",并导致其结果"and-ed",从而产生假。
if [ "$REG" -a "$VIN" ]
不起作用(如此处所定义)。这与if test "true" -a "false"
相同。任何非空字符串都是真的,所以这个语句是真的。if [[ "$REG" && "$VIN" ]]
也是如此
然而:
if [[ `$REG` && `$VIN` ]] # works
确实有效,因为在这里您执行命令 true 和 false。
以最 POSIX 的方式改用&&
:
if [[ "$REG" && "$VIN" ]]; then
echo $REG $VIN
fi
如果要使用 -a
,请用括号括起来:
if [ "$REG" -a "$VIN" ]; then
if $REG && $VIN; then
正确的方法是:
if [[ $REG = 'true' && $VIN = 'true' ]]; then
echo "$REG $VIN"
fi
这是最正确和最安全的方法(不像其他答案所建议的那样执行您的$REG
和$VIN
)。例如,如果变量$REG
为空会发生什么?或者,如果它等于不仅仅是true
或false
如果你想在 bash 中出现布尔行为,那么请考虑空字符串是假的。
REG=1
if [[ $REG ]]; then
echo '$REG is true!'
fi
或者像多个变量一样:
REG=1
VIN=''
if [[ $REG && $VIN ]]; then
echo '$REG and $VIN are true!'
fi
if [[ $REG && ! $VIN ]]; then
echo '$REG is true and $VIN is false!'
fi
因此,如果您希望false
某些内容,请将其保留为未设置或使用空字符串。