여러 조건이있는 Bash if 문에서 오류가 발생 함


165

두 개의 오류 플래그를 확인하는 스크립트를 작성하려고하는데 하나의 플래그 (또는 둘 다)가 변경되면 오류가 발생합니다. 내 스크립트 :

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

기본적으로 다음과 같은 것이 있어야합니다.

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

내가 얻는 오류는 다음과 같습니다.

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

대괄호가 엉망입니까?


이것을 확인하십시오 : theunixshell.blogspot.com/2013/05/…
Vijay

2
괄호를 사용하여 - ()
AlikElzin-kilaka


3
논리적으로 a==1 or b==2이미 사례를 다루고 a==1 and b==2있습니다. 이를 별도로 테스트하는 것은 여기에서 완전히 불필요한 것입니다.
tripleee

답변:


249

사용 -a(과) 및 -o작업 (또는을).

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

최신 정보

사실 당신은 여전히 사용할 수 있습니다 &&||-eq작동. 따라서 스크립트는 다음과 같습니다.

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

귀하의 경우 마지막 두 표현식을 버리고 다음과 같이 하나 또는 작업을 고수 할 수 있습니다.

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

3
@Simply_Me : 아니오, 피연산자 중 하나 또는 둘 모두 가 참이면 논리 OR이 참 입니다. "독점 또는"(XOR)을 생각하고 있습니다. 피연산자 중 정확히 하나가 참이면 참입니다. (실제로 두 개 이상의 피연산자에서 작동하는 XOR 버전이 있으며,이 경우 홀수의 피연산자가 참이면 참입니다.)
Gordon Davisson

4
BTW, 원래 코드의 문제에는 그룹화 [및 사용 ](그러지 않음) 및 연산자 주위에 공백을 두지 않는 것 (예 "$my_error_flag"="1":)이있어 쉘이 연산자로 인식 하지 못합니다 . BashFAQ # 17 (그룹화)# 31 (다른 유형의 테스트 표현식의 차이점 )을 읽으 십시오 . 실제로이 경우 산술 표현식 을 사용하는 것이 훨씬 더 쉽습니다 .
Gordon Davisson

7
-a-o바이되지 않는 것으로 간주됩니다 POSIX 사양 ; ||업데이트에서 와 같이 별도의 테스트를 사용 하십시오.
chepner

1
서브 쉘을 사용하여 그룹화 할 필요가 없습니다. 일반적으로 그룹화를 사용하는 {}것도 가능합니다.
phk

1
위의 phk 주석에 추가하기 위해 ()는 모든 종류의 미묘한 [아마도 원치 않는] 효과를 가질 수있는 bash에서 서브 쉘을 시작합니다.
brett

70

[[또는 ((키워드를 사용할 수 있습니다 . 당신이 사용하는 경우 [[키워드, 당신은 같은 사용 문자열 사업자에게있다 -eq, -lt. , 및과 ((같은 연산자를 직접 사용할 수 있기 때문에 산술에 가장 적합 하다고 생각 합니다.==<>

[[연산자 사용

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

((연산자 사용

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

휴대용이 아니므로 사용 -a하거나 -o조작 하지 마십시오 .


8

다음을 시도하십시오

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

2
( ... )서브 쉘 생성-많은 성능에 영향을 미치지 않습니다.
Charles Duffy

4
{ ...; }서브 쉘 작성없이 그룹화하는 데 사용하십시오 .
Charles Duffy

1

스크립트 를 읽으면 영감을 얻을 수 있습니다entrypoint.sh 지정된 변수가 설정되어 있는지 확인하는 MySQL에서 기고자가 작성한 .

스크립트에서 알 수 있듯이 다음과 같이 파이프 할 수 있습니다 -a.

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi

1
-aPOSIX test표준 의 현재 버전에서 더 이상 사용되지 않는 것으로 표시됩니다 . pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlOB마커를 참조하십시오 . 보다 안정적인 코드를 만드는 데 사용하십시오 . [ -z "$FOO" ] && [ -z "$BAR" ]
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.