bash 复合 if 语句与布尔值



我试图弄清楚为什么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为空会发生什么?或者,如果它等于不仅仅是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某些内容,请将其保留为未设置或使用空字符串。

相关内容

  • 没有找到相关文章

最新更新