在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。尽管它看起来很复杂。它很有效!!!谢谢。