쉘: 왜 [ -n "$VAR" ] 대신 [ -n "${VAR-}" ] 입니까?

쉘: 왜 [ -n "$VAR" ] 대신 [ -n "${VAR-}" ] 입니까?

쉘 스크립트가 많이 보입니다(예:이것) 변수가 존재하는지 확인합니다. 예를 들면 다음과 같습니다.

[ -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 -ntest -z

나는 이것을 직접 본 적이 없기 때문에 경험이 없는 쉘 프로그래머가 어떻게 생각할지 짐작할 수 있습니다.설정되지 않음가치와비어 있는작동 방식에는 test -n가치가 있지만 이는 내장되어 있고 결함이 있거나 누군가가 그 의미를 고려하지 않고 사용하려고 한 다음 그런 식으로 방어하는 test경우 에만 발생합니다.[set -u

관련 정보