如何在 bash 中使用比较运算符?

如何在 bash 中使用比较运算符?

如何在 bash 中使用<=>=>和?<

代替:

if [[ $arg1 -ge $num1 && $arg2 -le $num2 ]]; then
     ...
fi

有更多类似的东西:

if [[ $arg1 >= $num1 && $arg2 <= $num2 ]]; then
     ...
fi

答案1

具体来说bash

  • ((arg1 >= num1))(继承自ksh)进行算术比较。arg1这里num1指的是同名的shell变量。每个变量都被解释为算术展开并替换结果。这里如果$arg1is010$num1is 4+5,结果将是错误的(该((...))命令将以非零退出状态返回),因为0108 是八进制,而4+59 是八进制。
  • (($arg1 >= $num1)):与上面相同,只是$arg1$num1在计算整个算术表达式之前进行扩展。如果$arg1was(2$num1was 2),则前一个命令将会失败,因为(22)本身不是有效的表达式。但在这里它会成功,因为(2 >= 2)将计算算术表达式。一般来说,在算术表达式中,最好将其$省略。例如a=2+2; echo "$((3 * $a))"与进行比较a=2+2; echo "$((3 * a))"
  • let "..."(也来自 ksh)。与此相同,((...))只是它被解析为普通命令,可读性较差,可移植性较差,并且您需要更加注意引用。
  • [ "$arg1" -ge "$num1" ]。这是标准且便携的。仅支持十进制常量。[ 010 -ge 9 ]是相同的[ 10 -ge 9 ]
  • [[ $arg1 -ge $num1 ]]。也来自 ksh,但有重大差异。这次,$arg1$num1被视为算术表达式,而不仅仅是十进制常量。[[ 010 -ge 9 ]]再次返回 false。
  • [[ $arg1 < $num1 ]]。字符串比较。它用于strcoll()比较字符串,因此使用语言环境中的排序算法。注意,当<>使用排序算法时,=/进行字节到字节的比较,因此可能存在所有,和/返回 false 的==字符串对。并且不受支持。<>===<=>=
  • [ "$arg1" "<" "$num1" ]。非标准。与上面相同,但使用[命令。<需要加引号,这样它就不会被视为重定向运算符。
  • expr " $arg1" "<=" " $num1" > /dev/null(请注意嵌入空格以强制词法比较并避免字符串看起来像expr运算符的问题)或者awk 'BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}' "$arg1" "$num1"是使用strcoll().

答案2

这些运算符用于例如(( ... ))$(( ... ))(算术评估算术展开分别):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then
    ...
fi

并且还与let.以下内容与上述内容等效:

if let "arg1 >= num1" && let "arg2 <= num2"; then
    ...
fi

请参阅 Bash 手册中名为“算术评估”的部分。

相关内容