쉘 스크립트가 많이 보입니다(예:이것) 변수가 존재하는지 확인합니다. 예를 들면 다음과 같습니다.
[ -n "${VAR-}" ]
내가 아는 한, 변수 유무(또는)를 확인할 때 a를 제공하지 않는 형식을 사용하는 ${VAR-fallback}
것은 의미가 없습니다 . 마찬가지다. 예를 들어, 설정되지 않은 변수의 경우fallback
-n
-z
${VAR:-fallback}
unset VAR
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
그리고 빈 변수로
VAR=
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
하지만 묻고 싶을 정도로 많은 곳에서 그것을 볼 수 있습니다. 제가 뭔가를 놓치고 있는 걸까요? 이것은 오용으로 이어지는 오해입니까, 아니면 이에 대한 실제 이유가 있습니까?
답변1
set -u
유효하지만 VAR
설정 되지 않은 경우 [ -z "$VAR" ]
오류가 발생합니다. [ -z "${VAR-}" ]
기본값을 사용하면 설정되지 않은 변수 사용에 대한 확인이 무시되고 오류가 발생하지 않습니다.
답변2
${VAR:-}
당신 말이 절대적으로 옳습니다. 해당 테이블이나 or와 함께 테이블을 사용할 이유가 없습니다 .${VAR-}
test -n
test -z
나는 이것을 직접 본 적이 없기 때문에 경험이 없는 쉘 프로그래머가 어떻게 생각할지 짐작할 수 있습니다.설정되지 않음가치와비어 있는작동 방식에는 test -n
가치가 있지만 이는 내장되어 있고 결함이 있거나 누군가가 그 의미를 고려하지 않고 사용하려고 한 다음 그런 식으로 방어하는 test
경우 에만 발생합니다.[
set -u