주어진 변수가 설정되지 않은 일부 명령을 실행하려면 다음을 사용합니다.
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
이 뒤에 숨겨진 역사는 무엇입니까? 구문이 왜 다른지 이해가 되지 않습니다. 나는 이것이 -v
bash에 최근 추가된 것이라고 읽었습니다.(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
를 사용하면 -z
null 값이 할당된 변수와 값이 할당되지 않은 변수를 구분할 수 없습니다.
게다가 그렇게 하지 않는 것이 [[ -z $x ]]
현명합니다 .set -u
[[ -v x ]]