[[ -z ]]와 [[ -v ]]의 구문이 다른 이유는 무엇입니까?

[[ -z ]]와 [[ -v ]]의 구문이 다른 이유는 무엇입니까?

주어진 변수가 설정되지 않은 일부 명령을 실행하려면 다음을 사용합니다.

if [[ -z "$a" || -z "$v" ]]
then
  echo "a or b are not set"
fi

그러나 동일한 구문이 적용되지 않으므로 다음을 -v사용해야 합니다.

if [[ -v a && -v b ]]
then
  echo "a & b are set"
fi

이 뒤에 숨겨진 역사는 무엇입니까? 구문이 왜 다른지 이해가 되지 않습니다. 나는 이것이 -vbash에 최근 추가된 것이라고 읽었습니다.(4.2)?

답변1

테스트 연산자 는 동일 -v하지 -z않습니다.

연산자는 -z문자열이 비어 있는지 확인합니다. 따라서 이것은 [[ -z "$a" ]]"변수가 설정되지 않음"에 대한 좋은 근사치를 제공 a하지만 완벽한 근사치는 아닙니다.

  • a설정되지 않은 대신 빈 문자열로 설정되면 표현식은 true를 생성합니다.

  • a설정하지 않고 nounset이 옵션을 활성화하면 포함 스크립트가 실패합니다.

반면에 변수는 극단적인 경우에도 -v a정확하게 "설정"됩니다 a. to $a대신 전달하는 것은 테스트 운영자가 보기 전에는 설정되지 않을 수 있는 변수를 확장하므로 변수(이름으로 지정됨)를 확인하고 설정 여부를 판단하는 것이 반드시 필요하다는 점을 분명히 해야 합니다. 운영자의 임무.a-v

답변2

-z그리고 다른 의미를 갖습니다 -v:

echo Empty:
x=""  # Same with x=
[[ -z $x ]] && echo z
[[ -v  x ]] && echo v
unset x

echo Unset
[[ -z $x ]] && echo z
[[ -v  x ]] && echo v

를 사용하면 -znull 값이 할당된 변수와 값이 할당되지 않은 변수를 구분할 수 없습니다.

게다가 그렇게 하지 않는 것이 [[ -z $x ]]현명합니다 .set -u[[ -v x ]]

관련 정보