两个整数之间的 Bash 值,而不是浮点数

kft*_*oyz 2 bash

您好我有这个简单的comparisson运营商来说,是否number是(包括1和3太)1和3之间,但如果我assingnumber3,2它仍然接受是正确的。它应该只接受这些值1-2-3

我的代码

    if (("$number" >= 1 && "$number" <= 3)); then
    echo 'Correct number'
    fi
    
Run Code Online (Sandbox Code Playgroud)

Léa*_*ris 6

(("$number" >= 1 && "$number" <= 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
Run Code Online (Sandbox Code Playgroud)

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

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

在算术表达式中或在比较整数的测试中使用之前,始终检查number包含有效整数(请参阅:测试字符串是否为有效整数)。

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

另一个数字测试方法[ "$number" -ge 1 ] && [ "$number" -le 3 ]在其他答案建议将错误出有:bash: [: 3,2: integer expression expected

它还需要测试有效整数:

[[ $number =~ ^[-+]?[0-9]+$ ]] && [ "$number" -ge 1 ] && [ "$number" -le 3 ]
Run Code Online (Sandbox Code Playgroud)

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

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

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

$ (( 13 >= 12 )); echo $?
0
Run Code Online (Sandbox Code Playgroud)

$ (( 013 >= 12 )); echo $?
1
Run Code Online (Sandbox Code Playgroud)


Mik*_*iak 5

尝试这个:

if [ "$number" -ge 1 ] && [ "$number" -le 3 ]; then 
echo 'Correct number'
fi
Run Code Online (Sandbox Code Playgroud)