Bash 对变量进行逻辑运算

Bash 对变量进行逻辑运算

对你来说很简单。我们可以在 Bash 中做这样的事情而不使用 IF 语句吗?

a=0
b=0
c=1

result= [ a || b || c ] # result of binary operation should be 1

这可能吗?

答案1

您可以使用算术表达式中存在的按位运算符:

result=$((a|b|c))

&对于 AND 和^XOR 也类似)。

逻辑运算符也适用于算术表达式:

result=$((a||b||c))

(类似地&&)。

赋值可以是表达式本身的一部分(=在这种情况下,在 周围允许有空格):

(( result = a || b || c ))

如果您使用trueandfalse来代替,则根本不需要任何括号:

a=false
b=false
c=true
a || b || c
result=$?

问题是在这种情况下,0 表示 true。

在方括号中,只有未设置或空值本身为 false。所以,你可以使用

a=
b=
c=1
[[ $a || $b || $c ]]
result=$?

同样,零对应于 true,但您可以通过将其更改为来解决这个问题

! [[ $a || $b || $c ]]

答案2

我的变体如何首先定义复杂表达式并稍后解析:

TIME=10#$(date +%H%M)
DAY=$(date +%a)

case $DAY in
  Mon|Tue|Wed|Thu|Fri)
    a=$(( 10#0110 < $TIME && $TIME < 10#0530 || 1630 < $TIME && $TIME < 1910 ))
    ;;
  Sat|Sun)
    a=$(( 10#0150 < $TIME && $TIME < 10#0650 || 1610 < $TIME && $TIME < 1910 ))
    ;;
  *)
    a=0
    ;;
esac
if [[ $a == 1 ]]
then
  echo "Cheap electricity"
else
  echo "Expensive electricity"
fi

注意10#前缀阻止 bash 解释八进制算术中的零前导数字并强制使用十进制算术。

相关内容