我想弄清楚为什么bash“miss-behaves”:
REG=true
VIN=false
if $REG -a $VIN; then
echo $REG $VIN
fi
运行时,它会产生:
$ bash test.sh
true false
我什么都没想,你能说明如何对两个变量进行全面评估吗?
答案 0 :(得分:2)
在REG=true
中,'true'是一个字符串。当您执行$REG
时,您正在执行命令 true
。
if $REG -a $VIN
表示“使用选项'-a'和参数'$ VIN'运行命令true
,它们被true忽略。所以它就像你有{{1}一样}。
if true
导致'true'和'false'被执行,其结果'and-ed',导致错误。
if $REG && $VIN
不工作(如此处所定义)。这与if [ "$REG" -a "$VIN" ]
相同。任何非null字符串都为true,因此该语句为true。 if test "true" -a "false"
然而:
if [[ "$REG" && "$VIN" ]]
确实有效,因为在这里执行命令true和false。
答案 1 :(得分:1)
以最POSIX的方式使用&&
:
if [[ "$REG" && "$VIN" ]]; then
echo $REG $VIN
fi
如果您想使用-a
,请使用括号括起来:
if [ "$REG" -a "$VIN" ]; then
if $REG && $VIN; then
答案 2 :(得分:1)
正确的方法是:
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
,那么要么不设置它,要么使用空字符串。