if...를 혼합하고 {명령 그룹화} 및 [[ test ]] 및 논리 연산자 [off]

if...를 혼합하고 {명령 그룹화} 및 [[ test ]] 및 논리 연산자 [off]

편집하다: 다시 시도했는데 지금은 잘 작동합니다 bash. 무엇이 바뀌었는지 모르겠습니다. 내 편집기(Bash IDE 확장이 포함된 VS Code)에서 여전히 failed to parse오류가 발생하지만 스크립트는 제대로 실행됩니다. 이 질문을 삭제해야 하나요?

원래 질문

내 스크립트는 현재 다음을 수행합니다.

if cmd1; then
  echo Success
else
  if [[ "$x" == "z" ]] && cmd2; then
    echo Success
  else
    echo Failure
  fi
fi

나는 계속해서 "한 줄"로 줄이려고 노력하지만 bash다음과 같은 말에 목이 막힙니다.

if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
   echo Success
else
   echo Failure
fi

그렇지 않으면 항상 실행되기 { grouping }때문에 이것이 필요하다고 생각합니다 . && cmd이 문제를 어떻게 해결할 수 있나요?

답변1

서브쉘을 사용하여 그룹화할 수 있습니다.

if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
  ...
else
  ...
fi

답변2

잘 작동합니다:

cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
   echo Success
else
   echo Failure
fi
Success

에서 이 코드를 실행하고 있지 않습니까 sh? 그것은 당신에게 다음과 같은 것을 줄 것입니다

sh: 4: [[: not found

답변3

질문의 코드는 실제 셸에서 제대로 작동해야 하지만 일부 다른 프로그램에서는 이를 구문 분석하지 못할 수도 있다는 점을 이해합니다. 프로그램을 고칠 수 없다고 가정하면, 해결 방법은 조건의 두 번째 부분을 함수로 분할하는 것일 수 있습니다.

cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
     ...

그렇게 간단하지는 않지만 파서가 가치가 있다면아무것, 함수 정의를 구문 분석할 수 있어야 합니다.

관련 정보