首页 > 解决方案 > 小于运算符的行为与 BASH 中的 -le 有何不同?

问题描述

#!/bin/bash

a=10
b=30

[ $a -eq $b ]
echo $?

echo $(($a==$b))

此代码输出 1 然后 0。为什么 $(($a==$b)) 输出 0?

我已经用 -le 和 < 也试过了。

[ $a -le $b ] 输出 0

$(($a < $b)) 输出 1

我同时使用了 ksh 和 bash 来检查

标签: bashunixkshwindows-subsystem-for-linux

解决方案


您无法将$?一个操作的输出与另一个操作的输出进行比较。这些是不同的东西,因为退出状态成功为 0,非零结果反映失败,但在数字上下文中(例如$(( ))进入),真值为 1,失败为 0。

将您的测试与:

#!/bin/bash

a=10
b=30

[ "$a" -eq "$b" ]
echo "Exit status using -eq: $?"

(( a == b ))
echo "Exit status using (( )): $?"

输出正确:

Exit status using -eq: 1
Exit status using (( )): 1

我对引号、 s 等所做的更改(除了从 切换$(( ))到)是对您当前数据的修饰——它们可能会用意外的值改变行为,所以我建议在您的代码中使用这些做法,但它们实际上并没有修改立即输出。(( ))$


推荐阅读