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

时间:2018-11-26 08:35:27

标签: bash shell

我有一个问题

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

3 个答案:

答案 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 ))]}

但是我发现只打印01没什么区别。