Bash - 检查变量是真还是假的更简单易读的方法

Bash - Simpler and more legible way to check if variable is true or false

在 Bash 中 0true 而任何其他数字都是 false,就像在 C 中一样。

为了测试一个变量是否为真,我目前正在做:

is_on=0

if [ $is_on -eq 0 ]; then
    echo "It's on!"
else
    echo "It's off!"
fi

我想要更简单易读的东西,所以我尝试了:

这不是因为 [ 总是 returns 0:

is_on=0

if [ $is_on ]; then
    echo "It's on!"
else
    echo "It's off!"
fi

这也不是因为 [[ 总是 returns 0:

is_on=0

if [[ $is_on ]]; then
    echo "It's on!"
else
    echo "It's off!"
fi

这也行不通:

is_on=0

if [ $is_on -eq true ]; then
    echo "It's on!"
else
    echo "It's off!"
fi

这与逻辑相反:

is_on=0

if (( $is_on )); then
    echo "It's on!"
else
    echo "It's off!"  # Prints this!
fi

这有效,但它是一个字符串比较:

is_on=true

if [ $is_on = true ]; then
    echo "It's on!"
else
    echo "It's off!"
fi

是否有更简单易读的方法来检查变量是 true 还是 false

值的解释 取决于上下文。所以一些事实:

做一些逻辑时:

  • 0 表示 false,
  • 非零 表示 为真。

做某事时:

  • 0退出状态表示成功,
  • 非零退出状态表示失败。

if 主体在命令成功时执行。 if 主体在命令以零退出状态退出时执行。

(( ... ))算术展开的退出状态取决于里面最后一个表达式的逻辑值。 true 值表示成功,false 值表示失败(读两遍)。

参见 man test and inspect STRING equivalent to -n STRING part. Also research bash builtins, bash shell arithemtic, bash exit status

Is there a simpler and more legible way to check if a variable is true or false?

在受控环境中,我只使用变量值并执行 shell 内置函数 falsetrue(即 return 非零退出状态(失败)和零(成功)分别为:

is_on=true
if "$is_on"; then

在不受控制的环境中,最好比较要保护的字符串以防止奇怪的用户输入:

is_on=""
if [[ "$is_on" = 'true' ]]; then

如果你想处理复杂的情况,那就自己写逻辑吧。在bash中所有变量值都是字符串,没有其他变量类型(好吧,有字符串数组):

shopt +extglob
user_boolean_value_to_my_boolean_convention() {
    case "" in
    # 0 and 0000000 are false
    +(0)) echo false; ;;
    # any nonzero number or string true is true
    +([0-9])|T|t|[Tt][rR][uU][eE]) echo true; return; ;; 
    # all the rest is false
    *) echo false; ;;
    esac
}
is_on=$(user_boolean_value_to_my_boolean_convention "")
if "$is_on"; then