set -Euopipelinefail을 사용할 때 변수의 존재를 어떻게 확인하나요? [복사]

set -Euopipelinefail을 사용할 때 변수의 존재를 어떻게 확인하나요? [복사]

다음 코드를 사용하여 변수가 비어 있지 않고 제대로 작동하는지 확인합니다.

VAR=(var1 var2 var3)

chec_var() {
for item in "${@}"; do
if [ -z "${!item}" ]; then
  returncode=1
  break
else
  returncode=0
fi
done
}

all_vars() {
if chec_var "${VAR[@]}"; then
  if [[ ${returncode} -gt 0 ]]; then
    echo "error"
    exit 1
  else
    echo "OK"
  fi
fi
}

all_vars

스크립트 끝에 set -Euopipelinefail을 추가하면 문제가 발생합니다.
변수 중 하나가 존재하지 않는 경우보다 다음 오류가 발생합니다.
/script line number: !item unbound Variable
하지만 파이프라인 실패의 메시지 대신 "에코 오류"가 표시되어야 합니다.

또 다른 경우에는 모든 변수가 존재할 때 루프를 통과하여 모든 변수를 확인하는 대신 첫 번째 변수만 확인하고
"echo OK" 라고 말합니다. 질문: 여기서 내가 뭘 잘못하고 있는 걸까요? -Euopipelinefail이 활성화되었을 때 모든 변수를 반복하여 모두 확인하여 "OK"를 표시하려면 어떻게 해야 합니까?





Pipelinefail을 사용하여 수정된 스크립트는 다음과 같습니다.

VAR=(var1 var2 var3)

chec_var() {
for item in "${@}"; do
if [ -z "${!item}" ]; then
  return 1
  break
else
  return 0
fi
done
}

all_vars() {
if chec_var "${VAR[@]}"; then
  if [[ ${returncode} -gt 0 ]]; then
    echo "error"
    exit 1
  else
    echo "OK"
  fi
fi
}

set -Euo pipefail

all_vars

답변1

Bash에서 이를 수행하는 한 가지 방법은 다음과 같습니다.

if declare -p variable >&/dev/null ; then
  echo "variable exists"
else
  echo "variable does not exist"
if

declare -p변수가 존재하면 종료 코드 0이 반환되고, 존재하지 않으면 종료 코드 1이 반환됩니다. stdout 및 stderr의 리디렉션은 출력을 보고 싶지 않고 변수가 존재하는지 테스트하기만 하기 때문입니다.

그러나 대부분의 경우 변수가 null인지 여부를 테스트하는 것(즉 [ -z "$variable" ], null이 아닌 반전된 테스트 사용 [ -n "$variable" ])만으로 충분합니다.

관련 정보