Bash は変数に対して論理演算を実行します。

Bash は変数に対して論理演算を実行します。

あなたにとっては簡単です。 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進数算術を強制的に使用することに注意してください。

関連情報