【问题标题】:Bash scripting - Boolean in if block?Bash 脚本 - if 块中的布尔值?
【发布时间】:2013-08-03 01:26:12
【问题描述】:

我尝试了此 SO 帖子中的代码 - How to evaluate a boolean variable in an if block in bash?,但它不起作用。看起来 BASH 中没有布尔值。是否有完美的解决方法可以让我在 BASH 中设置和检查布尔值?

我的代码 -

#!/bin/bash
flag=true
if [ $flag ]
echo 'True'
#flag=false
#echo 'Now changed to false' 
fi

即使第 2 行中的 flag=false,输出仍然为 True。为什么?

【问题讨论】:

  • 请在提供的链接中查看 Jens 的回答。如果 $myVar;然后... ;fi 逻辑似乎存在安全漏洞。

标签: linux bash unix boolean


【解决方案1】:

试试不带方括号,像这样

#!/bin/bash
flag=true
if $flag ; then
   echo 'True'
   #flag=false
   #echo 'Now changed to false' 
fi

【讨论】:

  • +1 表示正确答案。另请注意,脚本的第一行是“#!”,而不是“!#”。
  • 有括号和不带括号有什么区别?
  • 如果没有括号,它会尝试将值作为命令执行。它在这里工作是因为true 命令返回true,而false 命令返回false。您也可以设置flag="rm -r /*",并设置条件删除所有文件。
  • 请在提供的链接中查看 Jens 的回答。如果 $myVar;那么... ;fi 逻辑似乎存在安全漏洞。
  • @blasto,是否是安全问题取决于脚本和变量值的来源。有时这肯定是个问题。
【解决方案2】:

由于“人工测试”的这一部分,它的评估结果为真 -

 [ expression ]
         string        True if string is not the null string.

你需要使用类似 -

#!/bin/bash
flag=1
if [ ${flag} -eq 1 ]
then
    echo 'True'
    #flag=0
    #echo 'Now changed to false' 
fi

【讨论】:

  • 顺便说一句,你为什么把标志放在 {} 括号里?我们不能改用 "$flag" == 1 吗?
  • ${flag}$flag 是相同的。但是,您不应该在此处使用双引号和 ==,因为您想要进行数字比较,而不是字符串比较。
  • @AnsgarWiechers - 谢谢。但是,这里的数字和字符串比较不是一回事吗?我们只是在创建一个标志并检查它的状态。
  • @blasto。我出于习惯使用 ${}。它可以防止 bash 尝试解释变量的内容。
猜你喜欢
  • 1970-01-01
  • 2014-02-02
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2013-03-01
  • 2015-03-28
  • 2021-08-03
相关资源
最近更新 更多