내가 뭐하는 거지
local w=""
if [[ -v "$w" ]]; then
echo
printf '%s\n' "VARIABLE SET TEST"
printf '%s\n' " w=\"$w\" | w: $w"
printf '%s\n' \
" [[ -v \"\$w\" ]] TRUE, w is not set to a value by assignment"
printf '%s\n' \
" [[ ! -v \"\$w\" ]] FALSE, w is not set to a value by assignment"
fi
[[ -v "$w" ]]
쉘 변수가 설정된 경우(값이 할당된 경우) True를 반환해야 합니다. 하지만 이는 오류를 반환합니다.
답변1
댓글에서 언급했듯이 [[ -v var ]]
변수를 사용하면이름, 확장된 값이 아닌 해당 값만으로는 설정되지 않은 변수와 빈 문자열로 설정된 변수 간의 차이를 알 수 없습니다.
그래서,
[[ -v var ]]
설정되어 있는지 테스트합니다var
(그러나 비어 있을 수 있음).[[ -n "$var" ]]
var
비어 있지 않은 문자열로의 확장을 테스트합니다 . 즉, 설정되어 있고 비어 있지 않습니다.[[ "$var" ]]
같은 상기와[[ -z "$var" ]]
var
빈 문자열로 확장되는지, 즉 설정되지 않았거나 빈 문자열로 설정되었는지 테스트합니다 .
그러나 set -u
변수가 설정되지 않고 유효하지 않으면 후자 두 개가 덜거덕거릴 것입니다. "${var-default}"
이를 방지하려면 기본값 확장을 사용해야 합니다 . 그리고 -v
테스트는 표준이 아닙니다.
다그의 대답모든 POSIX 유사 쉘에 작동하는 방법입니다.
답변2
변수가 설정되었는지 확인
-z
문자열 길이가 0이면 0(true)을 반환합니다.
${var+x}
변수(var)가 설정된 경우 다음으로 확장됩니다.x
[ -z "${var+x}" ] && echo "variable unset"
-n
문자열 길이가 0이 아닌 경우 0(true)을 반환합니다.
[ -n "${var+x}" ] && echo "variable set"
변수를 확인하고 설정되지 않은 경우 오류를 표시하려면 다음을 사용하십시오.
"${var?warn_unset}"
변수가 설정되지 않았는지 확인하거나비어 있는/ 문자 :
앞에 사용됩니다 .+
?
[ -z "${var:+x}" ] && echo "variable unset or empty"
"${var:?warn_unset_or_empty}"