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진수 산술을 강제로 사용한다는 점에 유의하십시오 .

관련 정보