다음 코드를 사용하여 변수가 비어 있지 않고 제대로 작동하는지 확인합니다.
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" ]
)만으로 충분합니다.