代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

如何在bash中评估if块中的布尔变量?[复制品]

  •  68
  • devoured elysium  · 技术社区  · 14 年前

    我定义了以下变量:

    myVar=true
    

    现在我想沿着这条线运行一些东西:

    if [ myVar ]
    then
        echo "true"
    else
        echo "false"
    fi
    

    上面的代码确实有效,但是如果我尝试设置

    myVar=false
    

    它仍将输出“真”。 可能有什么问题?

    编辑:我知道我可以做些事情

    if [ "$myVar" = "true" ]; then ...
    

    但这有点尴尬。

    谢谢

    2 回复  |  直到 8 年前
        1
  •  111
  •   Aaron Digulla    8 年前

    bash不知道布尔变量,也不知道 test (当你使用 [ )

    解决办法是:

    if $myVar ; then ... ; fi
    

    因为 true false 是返回的命令 0 1 分别是什么 if 期待。

    请注意,这些值是“交换的”。之后的命令 如果 必须返回 在成功的同时 在大多数编程语言中表示“假”。

    安全警告 :这是因为bash扩展变量,然后尝试以命令的形式执行结果!确保变量不能包含恶意代码,例如 rm -rf /

        2
  •  35
  •   Mark Lakata    9 年前

    请注意 if $myVar; then ... ;fi 构造存在您可能希望避免的安全问题

    case $myvar in
      (true)    echo "is true";;
      (false)   echo "is false";;
      (rm -rf*) echo "I just dodged a bullet";;
    esac
    

    你可能还想重新思考为什么 if [ "$myvar" = "true" ] 在你看来很尴尬。这是一个shell字符串比较,它可能会为了获得退出状态而分叉一个进程。叉子是一个沉重而昂贵的操作,而字符串比较则非常便宜。想想几个CPU周期,而不是几千个。我的 case 解决方案的处理也没有分叉。