명령 종료 상태를 처리하려면 다음과 같은 일반적인 패턴을 고려하십시오.
if COMMAND; then
echo success
else
echo failure
fi
동일한 변수 할당(주어진 set -o nounset
)을 사용하면 작동하지 않습니다.
$ if foo="$no_such_variable"; then echo success; else echo failure; fi
bash: no_such_variable: unbound variable
ㅏ변수 대체 확인또한 작동하지 않습니다.
$ if foo="${no_such_variable:?}"; then echo success; else echo failure; fi
bash: no_such_variable: parameter null or not set
명령문 내에서 할당의 반환 코드를 캡처하는 방법이 있습니까 if
? if [[ $# -eq N ]]
각 할당 자체에서 문제를 포착하는 대신 해당 문을 스크립트의 나머지 부분에 있는 모든 매개 변수 할당과 결합하므로 표준 해결 방법을 피하려고 합니다 .
이는 Python 모드와 유사합니다 if (foo := bar()):
.
답변1
변수를 설정하지 않는 내장 테스트를 중심으로 무언가를 구축해 볼 수도 있습니다 test -v no_such_variable
. 예를 들어 함수는 setvar
이 테스트를 수행하고 정상일 때만 할당할 수 있습니다.
set -o nounset
setvar(){
declare -n var=$1 # -n is like ${!var} but for lvalue too
declare value=$2
[ -v ${value} ] && var="${!value}"
}
if setvar foo no_such_variable
then echo success
else echo failure
fi
답변2
if 문에서 할당의 반환 코드를 캡처하는 방법이 있나요?
여기서 유용한 종료 상태를 볼 수 있을지 모르겠습니다.
set -u
/ 아래의 변수 확장 nounset
기능 은 ${var?message}
다음과 같습니다 .쉘 종료변수가 설정되지 않은 경우. 이후에는 스크립트가 더 이상 실행되지 않기 때문에 스크립트에서 종료 값을 볼 수 없습니다.
작업에 명령 대체가 포함되어 있으면 종료 상태가 거기에서 나옵니다. 그렇지 않으면 할당이 성공합니다.
변수가 설정되지 않았는지 확인하려면 대체 값 확장을 사용해야 하며, ${var+string}
변수가 설정되면(해당 값을 사용하지 않고) 값이 지정된 문자열로 확장되고, 설정되지 않으면 아무것도 확장되지 않습니다.
그래서
if [ "${var+set}" ]; then
foo="$var"
echo '$var copied to $foo'
else
echo '$var is unset'
fi
아니면 nounset
복사가 실패하지 않도록 비활성화하세요.
set +u
foo="$var"
echo '$var copied to $foo'
그러나 null이 아닌 값이 존재하는지 확인해야 하는 경우에는 이 작업을 별도로 수행해야 합니다.