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

在bash中将比较输出打印为布尔值,bash,shell,Bash,Shell,我有个问题 a=1 b=2 我希望将比较输出转换为变量。ie在windows语言中,您可以编写类似的内容。它应该打印false print ($a == $b) 在控制台中尝试下面这些 echo $a -eq $b echo (( $a -eq $b )) echo "$a" -eq "$b" c= $(expr "$a" -eq "$b" ) echo $c 请注意,bash本机不支持bool类型运算符。根据shell的成功/失败状态,所有命令/内置程序都会向shell返回退出代码。

我有个问题

a=1
b=2
我希望将比较输出转换为变量。ie在windows语言中,您可以编写类似的内容。它应该打印
false

print ($a == $b)
在控制台中尝试下面这些

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

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

因此,在
bash
中,进行比较,需要显式地设置
bool
字符串,如

[[ $a == $b ]] && echo true || echo false
请注意,使用
echo true
不应与内置的
/bin/true
/bin/false
混淆,后者分别将外壳的退出代码显式设置为
0
1
echo
语句只打印出标准输出中提到的字符串

还要注意的是,
[
是POSIX-ly-available
[
构造的shell关键字扩展。前者是添加到bourne-Reach shell中的,可能在其他兼容POSIX的shell中不可用。如果您正在寻找一种可移植的方法,请将
[
case
构造一起使用

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

我认为不可能直接在bash中实现

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

res=0; [ "$s1" == "$s2" ] && res=1
echo $res
它首先将
res
设置为零,然后仅当比较成功时才将
res
变量设置为
1

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

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

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

您可以使用算术展开

echo $(( a == b ))
如果表达式为true,则打印1;如果表达式为false,则打印0。无需在变量名之前添加
$
,您可以使用C语言中的运算符,也可以省略空格。有关详细信息,请参阅

让它打印字符串“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 ))]}

但我看不出有什么区别,然后只打印
0
1

[$a-eq$b];c=$?
@iporsercer。尽管它看起来很复杂。它很有效!!!谢谢。