bash 조건부 그룹화

bash 조건부 그룹화

bash변경해야 할 다음 조건부 테스트가 있습니다 .

if (( exec_rc == 1 )) && [ -z "$keymap_actm" ] && [ -n "$modmap_actm" ]; then

(( exec_rc == 1 ))항상 참이어야 합니다.

하지만 둘 중 하나가 참이면 [ -z "$keymap_actm" ]조건 [ -n "$modmap_actm" ]​​본문을 실행하고 싶습니다.

내가 원하는 것을 달성하기 위한 읽기 쉬운 방법은 무엇입니까?

답변1

전체적으로 사용됨 [[ … ]](a조건식구조). 조건식 내부에는 정수 간의 동등성이 명시되어 있습니다 -eq(텍스트 패턴 일치가 수행되며, 이는 어떤 ==값을 사용할 수 있는지에 따라 특정 스크립트에서 작동하거나 작동하지 않을 수 있습니다).exec_rc

if [[ $exec_rc -eq 1 && (-z $keymap_actm || -n $modmap_actm) ]]; then …

구분 기호 주위에는 공백이 필요합니다 [[ … ]](예: 명령 구분 구두점 옆 제외 ;). 조건식 내의 괄호와 연산자 주위에는 공백이 필요하지 않습니다.

답변2

그룹화는 산술과 유사한 방식으로 괄호를 사용하여 수행됩니다.

다음과 같이 할 수 있습니다(권장되지 않음).

if (( exec_rc == 1 )) && ( [ -z "$keymap_actm" ] || [ -n "$modmap_actm" ] ); then

그러나 위의 예에서 대괄호는 하위 쉘을 생성합니다. 작동하지만 쉘 중괄호의 하위 쉘을 사용하지 않는 것이 좋습니다.

if (( exec_rc == 1 )) && { [ -z "$keymap_actm" ] || [ -n "$modmap_actm" ] ; }; then

또는 그룹화를 위해 a를 사용할 수 있습니다 [[(을 사용하지 마십시오 [).

if (( exec_rc == 1 )) && [[ -z "$keymap_actm" || -n "$modmap_actm" ]]; then

또는 (권장 구문):

if [[ exec_rc -eq 1 && ( -z "$keymap_actm" || -n "$modmap_actm" ) ]]; then

[[구문은 모든 버전의 bash와 대부분의 Ksh 또는 zsh에서 작동하지만 Bourne에서는 작동하지 않습니다 sh.

관련 정보