쉘에서 복잡한 조건의 구문은 무엇입니까?


11

쉘 (sh)에 다음 테스트를 표시하려면 다음을 수행하십시오.

if ( a == 1 && ( b == 1 || b == 2 )) { ... }

지금까지 내가 쓸 수 있었던 최선은 다음과 같습니다.

if [[ $a -eq 1 ]]; then
  if [[ $b -eq 1 || $b -eq 2 ]]; then
     ...
  fi
fi

&&와 ||를 합성하는 방법을 모르겠습니다. 올바른 우선 순위로. 인터넷 검색에서 답을 얻지 못했습니다 (자습서는 기본 예만 제공합니다)

두 결합하는 구문은 무엇입니까 경우 하나로는?


1
사용하지 않는 이유는 ksh무엇입니까? 그런 다음 초기 코드에는 괄호 쌍이 하나 더 필요합니다.if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
manatwork

답변:


15

참고 [[ ]]Bourne 쉘 또는 POSIX 중 하나에 있지 않습니다 sh. 실제 sh구문에는 여러 가지 방법이 있습니다.

[ ]쌍만 사용

if [ 1 -eq "$a" -a \( 1 -eq "$b" -o 2 -eq "$b" \) ]; then
    # ...
fi

또는 POSIX -a-o옵션 피하기 1

if [ 1 -eq "$a" ] && { [ 1 -eq "$b" ] || [ 2 -eq "$b" ]; }; then
    # ...
fi

하나 하나 피하는 이유 -a-o최대 휴대 성입니다 - 모든 test또는 [구현 당신이 표현을 체인 경우에 당신이 무엇을 얻을 정확히 4 개 이상의 인수를 처리 할 수 -a-o\( \).


내 스크립트는 #! / bin / sh shebang이며 기본 쉘은 ksh 입니다. 왜 사용되지 않습니까?
Offirmo

2
@Offirmo 스크립트를로 선언하면에 /bin/sh없는 기능을 사용하여 스크립트를 작성하는 것은 올바르지 않습니다 sh. 당신은 알고 있어야 ksh아닙니다 sh, 그러나 오히려 상위 집합 sh. 당신이 가지고있는 경우 ksh- 부트 선언-된 직후 sh곳 시스템에 스크립트 sh에 대한 심볼릭 링크가 아닌 ksh, 그것을 깰 수 있습니다. 스크립트가 선언과 일치하는지 확인하여이 문제를 피할 수 있습니다.
jw013

/ bin / sh 를 shebang으로 설정 하면 스크립트가 / bin / sh 통해 호출 될 것이라고 생각했습니다 . 내 기본 쉘 (ksh)이 shebang을 무시하고 직접 해석한다는 의미입니까?
Offirmo

@ Offirmo 당신이 맞습니다 :의 shebang의 /bin/sh호출 /bin/sh합니다. 문제는 /bin/sh받아들이지 않습니다 [[. 예를 들어 shebang으로 [[받아들이는 쉘을 사용 하거나 사용할 수 없습니다 . [[ksh
jw013

2
문제는 일부 구현에서 -a/ -o가 지원하지 않는 것이 아니라 임의의 인수에 대해 신뢰할 수 없다는 것입니다. 등 [ "$a" = "$b" -o "$b" = "$c" ]의 값에 대한 실패 $a와 같은 !많은으로 [구현.
Stéphane Chazelas

2

나는 몇 가지 구문을 시도하고 그것을 발견

if [[ $a -eq 1 ]] && [[ $b -eq 1 || $b -eq 2 ]]; then
 ...
fi

작동합니다.


1
이것은 4 이상의 bash 버전에서 작동합니다.
Nikhil Mulley


0

간단한 방법으로 수행하는 올바른 방법 shell:

if test 1 -eq "$a" && test 1 -eq "$b" -o 2 -eq "$b"; then 
    ...
fi

설명:

test여기서는 괄호와 -o논리적 또는 역할을합니다 . 논리적이고 "괄호"안에 있으면을 사용 -a합니다.

이에 대한 자세한 내용은 여기를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.