【问题标题】:Bash value between two integers, NOT floats两个整数之间的 Bash 值,而不是浮点数
【发布时间】:2021-06-13 10:47:50
【问题描述】:

我有这个简单的比较运算符,它检查number 是否在 1 和 3 之间(也包括 1 和 3)。但如果我将number 分配给3,2,它仍然认为是正确的。

它应该只接受那些值1-2-3

我的代码

if (("$number" >= 1 && "$number" <= 3)); then
echo 'Correct number'
fi

【问题讨论】:

  • 你能澄清一下这个作业真的是number=1,2number=3,2请把作业放在你的问题/帖子中。

标签: linux bash shell


【解决方案1】:

(("$number" &gt;= 1 &amp;&amp; "$number" &lt;= 3)) 是 Bash 的独立算术表达式。

在算术表达式中,变量按原样扩展,如果它们包含有效的算术表达式的语法元素,这些元素也会被解释。

number="3,2" 在算术表达式中扩展为((3,2)),其中逗号, 被Bash 的算术表达式解释为语句分隔符。

让我们看看:

$ number="3,2"; echo "$((number))"
2
$ number="3+2"; echo "$((number))"
5
$ number="3*2"; echo "$((number))"
6

shell 只理解整数运算,但3,2 不是有效的整数值。

这意味着如果您不确定变量是否包含有效整数,则在算术表达式中使用它是不安全的。

在用于算术表达式或在比较整数的测试中使用之前,请始终检查 number 是否包含有效整数(请参阅:Test whether string is a valid integer)。

# Check number is a valid integer before testing its range.
[[ $number =~ ^[-+]?[0-9]+$ ]] && (("$number" >= 1 && "$number" <= 3))

其他答案中建议的其他数字测试方法[ "$number" -ge 1 ] &amp;&amp; [ "$number" -le 3 ] 将出错:bash: [: 3,2: integer expression expected

还需要对有效整数进行测试:

[[ $number =~ ^[-+]?[0-9]+$ ]] && [ "$number" -ge 1 ] && [ "$number" -le 3 ]

使用 POSIX shell,没有 Regex 测试,因此需要不同的方法:

case "${number#[+-]}" in(*[!0123456789]*|'')false;;esac &&
  [ "$number" -ge 1 ] && [ "$number" -le 3 ]

关于使用算术表达式比较数字的陷阱的附加说明。算术表达式会将整数的前导 0 处理为八进制:

$ (( 13 >= 12 )); echo $?
0

但是

$ (( 013 >= 12 )); echo $?
1

【讨论】:

    【解决方案2】:

    试试这个:

    if [ "$number" -ge 1 ] && [ "$number" -le 3 ]; then 
    echo 'Correct number'
    fi
    

    【讨论】:

    • 这将在number="3,2" 时出错,与:bash: [: 3,2: integer expression expected。您必须检查 number 是否包含有效整数。
    【解决方案3】:

    你必须重写你的代码如下:

    if [ "$number" -ge 1 ] && [ "$number" -le 3 ]; then
        echo 'Correct number'
    fi
    

    查看https://tldp.org/LDP/abs/html/comparison-ops.html 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 2011-07-14
      • 1970-01-01
      • 2019-10-17
      • 2015-12-23
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多