"if" 문에 변수가 있는지 확인하는 방법은 무엇입니까?

"if" 문에 변수가 있는지 확인하는 방법은 무엇입니까?

명령문에 변수가 있는지 확인해야 합니다 if. 일부 효과:

if [ -v $somevar ]
then
    echo "Variable somevar exists!"
else
    echo "Variable somevar does not exist!"

가장 가까운 질문은이것, 실제로 내 질문에 대답하지 않습니다.

답변1

최신 bash(4.2 이상):

[[ -v name_of_var ]]

에서 help test:

-v VAR, 쉘 변수 VAR이 설정된 경우 참

답변2

당신이 무엇을 의미하는지에 따라 달라집니다존재하다.

변수가 선언되었지만 값이 할당되지 않았는지 여부존재하다?

빈 목록이 할당된 배열(또는 해시) 변수인지 여부존재하다?

nameref 변수가 현재 할당되지 않은 변수를 가리키는지 여부존재하다?

$-, $#, 변수를 고려하시나요 $1? (POSIX는 그렇지 않습니다).

Bourne과 같은 쉘에서 표준적인 방법은 다음과 같습니다.

if [ -n "${var+set}" ]; then
  echo '$var was set'
fi

이는 스칼라 변수 및 기타 매개변수에 대해 변수에 값이 할당되었는지 여부(환경, 할당 read등에서 자동으로 null 또는 null이 아닌 값 for)를 결정하는 데 사용됩니다.

typeset또는 명령이 있는 쉘의 경우 declare다음과 같이 보고되지 않습니다.놓다이미 존재하는 변수발표하다하지만분산( 에서는 zsh변수를 선언하면 값이 할당되고, 지정되지 않은 경우 기본값이 할당됩니다.)

배열을 지원하는 쉘의 경우(및 다음 과 같이 보고 yash되지 않음 )zsh놓다인덱스 0의 요소가 설정되지 않은 경우 배열 변수입니다.

for bash( ksh93nor 는 아님 zsh), 유형 변수용연관 배열, 이는 다음과 같이 보고되지 않습니다.놓다키 "0"이 설정되지 않은 요소입니다.

ksh93bash유형 변수의 경우이름 참조, nameref 자체가 참조하는 변수가 고려되는 경우에만 true를 반환합니다.놓다.

ksh, zsh및 의 경우 bash더 나은 접근 방식은 다음과 같습니다.

if ((${#var[@]})); then
  echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi

ksh93및 4.4 이상 zsh에는 다음 bash도 있습니다.

if typeset -p var 2> /dev/null | grep -q '^'; then
  echo '$var exists'
fi

설정되거나 선언된 변수를 보고합니다.

답변3

답변에서 언급했듯이그래서, 확인하는 방법은 다음과 같습니다.

if [ -z ${somevar+x} ]; then echo "somevar is unset"; else echo "somevar is set to '$somevar'"; fi

여기서 ${somevar+x}는 매개변수 확장으로, var가 설정되지 않은 경우 null로 평가되고, 그렇지 않으면 문자열 "x"가 대체됩니다.

-n다른 답변이 제안했듯이 using은 변수에 빈 문자열이 포함되어 있는지 확인합니다. 존재 여부를 확인하지 않습니다.

답변4

if set|grep '^somevar=' >/dev/null;then
    echo "somevar exists"
else
    echo "does not exist"
fi

관련 정보