あなたにとっては簡単です。 IFステートメントを使用せずにBashでこのようなことを実行できますか?
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
代わりにandを使用すると、false
括弧はまったく必要ありません。
a=false
b=false
c=true
a || b || c
result=$?
問題は、この場合、0がtrueを意味することです。
角かっこ内では、設定されていない値またはnull値自体のみがfalseです。だから、あなたは使用することができます
a=
b=
c=1
[[ $a || $b || $c ]]
result=$?
繰り返しますが、0は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が8進数算術で先行番号0を解釈するのを防ぎ、10進数算術を強制的に使用することに注意してください。