shell 在bash中将比较输出作为布尔值打印出来

yb3bgrhw  于 2023-03-30  发布在  Shell
关注(0)|答案(4)|浏览(211)

我有个问题

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
abithluo

abithluo1#

可以使用算术展开。

echo $(( a == b ))

如果表达式为true,则输出1,如果表达式为false,则输出0。不需要在变量名前添加$,您可以像C语言一样使用运算符,并且可以省略空格。有关更多信息,请参阅Bash参考手册:Shell算术。
让它打印字符串“true”或“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 ]}

但是我看不出打印01有什么区别。

kmynzznz

kmynzznz2#

我不认为直接在bash中可以做到这一点。
但是,您可以根据比较运算符的返回代码执行以下操作:

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

它首先将res设置为零,然后仅当比较成功时才将res变量设置为1
或者,更简洁的内容如下:

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

它实际上打印了先前执行的命令的返回代码。注意,! not操作符应用于返回代码,因为0通常意味着成功,即在这种情况下变量是相同的。

ezykj2lf

ezykj2lf3#

请注意,bash本身并不支持bool类型操作符。所有命令/内置程序都会根据其成功/失败状态向shell返回退出代码。向shell返回代码0意味着操作成功,任何非零值都表示失败。
因此,在bash中,需要进行比较并显式设置bool字符串,类似于

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

注意,使用echo true不应与内置/bin/true/bin/false混淆,它们分别显式地将shell的退出代码设置为01echo语句只是打印出标准输出中提到的字符串。
还要注意的是,[[是POSIX可用的[结构的shell关键字扩展。前者是添加到bourne again shell中的,可能在其他POSIX兼容的shell中 * 不可用 *。如果您正在寻找一种可移植的方式来做到这一点,请将[case结构一起使用,如

[ "$a" -eq "$b" ]
case $? in
    0) printf '%s\n' "true" ;;
    *) printf '%s\n' "false" ;;
esac
3htmauhk

3htmauhk4#

如果你想posix-compliance:
测试$a -ne $B &&打印'假';返回1

相关问题