将bash中的比较输出打印为布尔值



我有一个问题

a=1
b=2

我想要一个变量的比较输出。用windows语言你可以写这样的东西。它应该打印false

print ($a == $b)

在控制台中尝试以下操作。

echo $a -eq $b
echo (( $a -eq $b ))
echo "$a" -eq "$b"
c= $(expr  "$a" -eq "$b"  )
echo $c

您可以使用算术展开。

echo $(( a == b ))

如果表达式为true,则打印1;如果表达式为false,则打印0。不需要在变量名之前添加$,您可以像在C语言中那样使用运算符,并且可以省略空格。有关更多信息,请参阅Bash参考手册:Shell算法。

使其打印字符串";真";或";false";有点棘手。通常我使用与@Inian相同的代码,但使用if ... then .. else ... fi,因为我通常在set -euo pipefail:下编码

if (( a == b )); then echo true; else echo false; fi

但我们可以聪明一点,做一个阵列:

to_bool[0]="false"
to_bool[1]="true"
echo ${to_bool[ a == b ]}

但我认为仅打印CCD_ 5或CCD_。

我认为不可能直接在bash中完成。

但您可以根据比较运算符的返回代码执行以下操作:

res=0; [ "$s1" == "$s2" ] && res=1
echo $res

它首先将res设置为零,然后仅当比较成功时才将res变量设置为1

或者,更简洁的内容如下:

[ $s1 -eq $s2 ]; echo $((!$?))

其从字面上打印先前执行的命令的返回代码。请注意,应用于返回代码的!不是运算符,因为0通常意味着成功,即在这种情况下,变量是相同的。

请注意,bash本身并不支持bool类型运算符。所有命令/内置程序都会根据shell的成功/失败状态向其返回一个退出代码。shell的代码0表示操作成功,任何非零都表示失败。

因此,在bash中,您需要进行比较,并需要显式地设置bool字符串,类似于

[[ $a == $b ]] && echo true || echo false

请注意,使用echo true不应与内置的/bin/true/bin/false混淆,后者分别将shell的退出代码显式设置为01echo语句只是打印出标准输出中提到的字符串。

还要注意,[[是POSIX ly可用[构造的shell关键字扩展。前者是添加到bourne再次外壳中的,并且可能在其他符合POSIX的外壳中不可用。如果您正在寻找一种可移植的方法,请使用[case构造作为

[ "$a" -eq "$b" ]
case $? in
0) printf '%sn' "true" ;;
*) printf '%sn' "false" ;;
esac

如果您需要它符合POSIX:

test $a -ne $b && printf 'false'; return 1

最新更新