쉘 변수가 설정되었는지 테스트

쉘 변수가 설정되었는지 테스트

내가 뭐하는 거지

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}"

관련 정보