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
.