![Bash 对变量进行逻辑运算](https://linux22.com/image/157057/Bash%20%E5%AF%B9%E5%8F%98%E9%87%8F%E8%BF%9B%E8%A1%8C%E9%80%BB%E8%BE%91%E8%BF%90%E7%AE%97.png)
对你来说很简单。我们可以在 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 ))
如果您使用true
andfalse
来代替,则根本不需要任何括号:
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 解释八进制算术中的零前导数字并强制使用十进制算术。