如何在 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变量。每个变量都被解释为算术展开并替换结果。这里如果$arg1
is010
和$num1
is4+5
,结果将是错误的(该((...))
命令将以非零退出状态返回),因为010
8 是八进制,而4+5
9 是八进制。(($arg1 >= $num1))
:与上面相同,只是$arg1
和$num1
在计算整个算术表达式之前进行扩展。如果$arg1
was(2
和$num1
was2)
,则前一个命令将会失败,因为(2
和2)
本身不是有效的表达式。但在这里它会成功,因为(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 手册中名为“算术评估”的部分。