我有一个问题
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
答案 0 :(得分:1)
请注意,bash
本身不支持bool
类型的运算符。所有命令/内置命令都根据外壳的成功/失败状态将退出代码返回到外壳。外壳程序上的代码0
表示操作已成功,任何非零值都表示失败。
因此,在bash
中,您需要进行比较,并且需要显式设置bool
字符串,类似
[[ $a == $b ]] && echo true || echo false
请注意,不要将echo true
与内置/bin/true
和/bin/false
混淆,后者将外壳程序的退出代码显式设置为0
和{{1} } 分别。 1
语句只是打印出标准输出中提到的字符串。
还要注意,echo
是POSIX可用[[
构造的shell关键字扩展。前者是bourne again外壳的添加,在其他POSIX兼容外壳中可能不可用。如果您正在寻找一种可移植的方法,请将[
结构与[
一起使用
case
答案 1 :(得分:1)
我认为不可能直接在bash中进行。
但是您可以根据比较运算符的返回代码执行以下操作:
res=0; [ "$s1" == "$s2" ] && res=1
echo $res
首先将res
设置为零,然后在比较成功的情况下将res
变量设置为1
。
或者,以下更简洁:
[ $s1 -eq $s2 ]; echo $((!$?))
从字面上打印先前执行的命令的返回代码。请注意,!
不是用于返回代码的运算符,因为0
通常表示成功,即在这种情况下,变量是相同的。
答案 2 :(得分:1)
您可以使用算术扩展。
echo $(( a == b ))
如果表达式为true,则将打印1;如果表达式为false,则将打印0。无需在变量名之前添加$
,可以使用C语言中的运算符,并且可以省略空格。有关更多信息,请参见Bash reference manual:Shell arithmetic。
具有打印字符串“ 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
没什么区别。