여러 논리 연산자 ((A || B) && C) 및“예기치 않은 토큰 근처의 구문 오류” 그 결과는 그렇지 않았습니다. 작동하지 않습니다. 참고

Bash 3과 함께 일하고 있으며 조건부를 만들려고합니다. C / C ++에서 그 간단한 방법은 다음과 같습니다 ((A || B) && C). Bash에서 그 결과는 그렇지 않았습니다.

작동하지 않습니다. 참고 <0 or 1>문자열 리터럴되지 않습니다; 0 또는 1을 의미합니다 (일반적으로에서옵니다 grep -i).

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi

결과는 다음과 같습니다.

line 322: syntax error near unexpected token `[['

그런 다음 시도했습니다.

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi

결과는 다음과 같습니다.

line 322: syntax error near unexpected token `[['

문제의 일부는 검색 결과가 사소한 예이며 복합 조건부에서는 더 복잡한 예가 아니라는 것입니다.

((A || B) && C)Bash 에서 간단한 작업을 수행하려면 어떻게합니까 ?


나는 그것을 풀고 여러 블록에서 동일한 명령을 반복 할 준비가되었습니다.

A=<0 or 1>
B=<0 or 1>
C=<0 or 1>

if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
    ...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
    ... 
fi


답변

bash 구문은 C에서 영감을 얻은 경우에도 C와 비슷하지 않습니다. C 코드를 작성하여 작동한다고 기대할 수는 없습니다.

쉘의 요점은 명령을 실행하는 것입니다. 대괄호 열기 명령 [은 단일 테스트 ¹를 수행하는 명령입니다. test(마지막 닫는 괄호없이) 쓸 수도 있습니다 . ||&&사업자들은 결합, 쉘 운영자입니다 명령을 , 테스트하지.

그래서 당신이 쓸 때

[ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eq "0" ]

그것은 파싱

[ [ "$A" -eq "0" ] ||
[ "$B" -ne "0" ] ] &&
[ "$C" -eq "0" ]

이것은 같은

test [ "$A" -eq "0" ||
test "$B" -ne "0" ] &&
test "$C" -eq "0"

불균형 괄호에 주목하십시오. 그래, 좋지 않아 괄호를 사용하는 시도에도 같은 문제가 있습니다 : 가짜 괄호.

명령을 그룹화하는 구문은 중괄호입니다. 중괄호를 구문 분석하는 방법에는 그 전에 완전한 명령이 필요하므로 개행 또는 세미콜론으로 중괄호 안의 명령을 종료해야합니다.

if { [ "$A" -eq "0" ] || [ "$B" -ne "0" ]; } && [ "$C" -eq "0" ]; then 

이중 괄호를 사용하는 다른 방법이 있습니다. 단일 괄호와 달리 이중 괄호는 특수 쉘 구문입니다. 조건식을 구분 합니다 . 이중 괄호 안에 괄호와 같은 연산자를 사용할 수 있습니다 &&||. 이중 괄호는 셸 구문이므로 셸은 이러한 연산자가 괄호 안에 있으면 일반 셸 명령 구문의 일부가 아니라 조건식 구문의 일부라는 것을 알고 있습니다.

if [[ ($A -eq 0 || $B -ne 0) && $C -eq 0 ]]; then 

모든 테스트가 수치 적이라면 , 또 다른 방법이 있는데, 이는 관절 표현 을 제한 합니다 . 산술 표현식은 C와 매우 유사한 구문으로 정수 계산을 수행합니다.

if (((A == 0 || B != 0) && C == 0)); then 

내 bash bracket primer가 유용 할 수 있습니다 .

[일반 쉬에서 사용할 수 있습니다. [[그리고 ((bash는 (그리고 KSH 및 zsh을)에 따라 다릅니다.

¹ 또한 여러 테스트를 부울 연산자와 결합 할 수 있지만 사용하기가 번거롭고 미묘한 함정이 있으므로 설명하지 않습니다.


답변

사용 [[:

if [[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]; then ...

원하는 경우 [다음이 작동합니다.

if [ \( "$A" -eq "0" -o "$B" -ne "0" \) -a "$C" -eq "0" ]; then ...

답변

-o중첩 된 || 대신 연산자를 사용하십시오 . -a다른 설명에서 필요한 경우 &&를 대체 할 수도 있습니다 .

   EXPRESSION1 -a EXPRESSION2
          both EXPRESSION1 and EXPRESSION2 are true

   EXPRESSION1 -o EXPRESSION2
          either EXPRESSION1 or EXPRESSION2 is true


if [  "$A" -eq "0" -o "$B" -ne "0"  ] && [ "$C" -eq "0" ]; then echo success;fi