bash复合if语句与布尔值

时间:2014-01-14 14:34:50

标签: bash if-statement boolean-operations

我想弄清楚为什么bash“miss-behaves”:

REG=true 
VIN=false

if $REG -a $VIN; then
    echo $REG $VIN
fi

运行时,它会产生:

$ bash test.sh 
true false

我什么都没想,你能说明如何对两个变量进行全面评估吗?

3 个答案:

答案 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变量为空,会发生什么?或者如果它等于不同于truefalse的其他内容会怎样?

如果你想在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,那么要么不设置它,要么使用空字符串。