我有一个问题
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的退出代码显式设置为0
和1
。echo
语句只是打印出标准输出中提到的字符串。
还要注意,[[
是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