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