【问题标题】:Bash: Why does my If-Statement always evaluate to true?Bash:为什么我的 If 语句总是评估为真?
【发布时间】:2015-12-07 21:24:11
【问题描述】:

我正在尝试在大多数语言中编写看似简单的 if 语句,但在 bash 中这似乎根本不起作用。

当我运行脚本时,它总是进入第一个 if 语句。谁能帮我解决我做错了什么?

PERC=.5
    if [  "$PERC" > "1.00" ]
            then
                    echo "Entered first statement"
            else
                    if [ "$PERC" < "1.00" ]
                            then
                                    echo "Entered second statement"
                    fi
    fi

感谢您的帮助。

【问题讨论】:

  • 您从哪里得知&gt;&lt;[ 的有效参数?
  • @IgnacioVazquez-Abrams 我没有,它用于 java、c++、c、Haskell 和我用过的大多数其他语言。我看到人们使用它而不是在 bash 中使用它,我也看到人们使用 -lt 和 -gt 但这对我也没有用。
  • @IgnacioVazquez-Abrams: help test 提到 &lt;&gt; 作为字符串运算符,那么为什么它们不应该是有效的参数,即使它们不适合比较数字(并且考虑到重定向) )?

标签: linux bash if-statement


【解决方案1】:

&gt;&lt; 比较字符串,而不是数字(并且必须用反斜杠或在单个 [...] 中引用)。使用-gt-lt等来比较数字,或者使用算术条件:

if (( a < b || b <= c )) ; then

但是请注意,bash 只处理整数算术。要比较浮点数,可以使用bc

if [[ 1 == $( bc <<< '1.5 < 1.00' ) ]] ; then

【讨论】:

  • 感谢您的回复。我刚刚完全复制了你的底部示例,我收到一条错误消息:)' line 7: if [[ 1== $( bc
  • @EthanMcTiernan:在您的精确副本中,== 之前缺少一个空格。
【解决方案2】:

&gt;&lt; 是 I/O 重定向运算符。所以

if [ "$PERC" > "1.0" ]

正在执行命令[ "$PERC ],将输出重定向到文件1.0,然后if正在测试命令是否成功。 [ "$PERC" ] 只是测试"$PERC" 是否为非空字符串。

要将它们用作test 命令中的运算符,您需要引用或转义它们:

if [ "$PERC" '>' "1.0" ]

您也可以使用 bash 的 [[ 条件语法代替 [ 命令:

if [[ $PERC > "1.0" ]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2018-10-15
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多