조건이 실행/작동하지 않는 경우 bash 스크립트 다중

조건이 실행/작동하지 않는 경우 bash 스크립트 다중

해당 애플리케이션 빌드 스크립트를 트리거하는 입력 기반 bash 스크립트를 작성하려고 합니다. 입력이 "all"이면 모든 애플리케이션이 호출됩니다. 여기서 문제가 발생합니다. 입력이 "all"이면 app_1과 app_2만 호출됩니다. 무엇이 문제가 될 수 있나요?

if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_1" ]
then 
   echo "BUILD_STAGE APP_1 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_2" ]
then 
   echo "BUILD_STAGE APP_2 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_3" ]
then 
   echo "BUILD_STAGE APP_3 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_4" ]
then 
   echo "BUILD_STAGE APP_4 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_5" ]
then 
   echo "BUILD_STAGE APP_5 build started"
fi
if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "app_6" ]
then 
   echo "BUILD_STAGE APP_6 build started"
fi

답변1

여기에 제공한 샘플 코드에서는 이런 일이 발생하지 않습니다. 아마도 이러한 echos는 수행 중인 더 복잡한 작업에 대한 자리 표시자일 뿐이며, 내 생각에는 작업이 실제로 app_2값을 변경하는 것 같습니다 $_BUILD_MODE.

여기에서 다음을 수행할 수 있습니다.

case $_BUILD_MODE in
  (all | app_1) task for app_1 ;;&
  (all | app_2) task for app_2 ;;&
  (all | app_3) task for app_3 ;;&
  ...
esac

이렇게 하면 길이가 더 짧고 깔끔해지며, $_BUILD_MODE처음에 한 번만 역참조되므로 이 특정 문제도 피할 수 있습니다.

;;&위의 내용은 bash에만 적용됩니다. zsh 및 mksh에서 동등한 구문은 with 입니다 ;|. zsh, mksh 및 bash 지원 ;;(유일한 표준 쉘인 Bourne 쉘에서) 및 ;& (Korn 쉘에서).

app_2작업을 호출 exit하거나 exec some-other-command치명적인 오류가 발생하거나 셸 프로세스가 종료될 수도 있습니다. 이 문제에 대한 해결책은 서브쉘을 (...).

bash -o xtrace(same as)를 사용하여 스크립트를 실행 bash -x하고 무슨 일이 일어나는지 확인하십시오.


1 예를 들어, 내장 기능이 손상된 파이프에 쓰는 경우 SIGPIPE를 통해, 특정 리소스 제한이 초과된 경우 SIGXCPU를 통해...

답변2

실제로 질문하는 내용은 아니지만 체인이 여기에 있더라도 일부 코드를 반복할 때 체인이 어색해 보이는 경우입니다 [ "${_BUILD_MODE}" = "all" ].

대신 작업을 함수에 넣고 해당 이름으로 배열을 만듭니다(테스트되지 않음).

app_1() {
    echo "BUILD_STAGE APP_1 build... "
}
app_2() {
    echo "BUILD_STAGE APP_2 build... "
}
tasks=(app_1 app_2)

for task in "${tasks[@]}"; do 
    if [ "${_BUILD_MODE}" = "all" ] || [ "${_BUILD_MODE}" = "$task" ]; then
        "$task"
    fi
done

함수 이름은 여기에서 사용된 작업 이름과 동일해야 합니다 _BUILD_MODE.

여기서 작업을 서브셸로 래핑하는 등 작업 실행 방식을 변경해야 하는 경우스티븐이 제안한다, 또는 일부 인쇄물을 추가하여 분리하는 경우 루프의 한 지점에서 이 작업을 수행할 수 있습니다.

관련 정보