쉘 스크립트에서 변수가 비어 있는지 테스트


27

변수가 비어 있는지 테스트하기 위해 많은 다른 쉘에서 다음 기술을 여러 번 사용하는 것을 보았습니다.

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi

보다 표준적인 것보다 이것을 사용하면 어떤 이점이 if [ -z "$1" ]있습니까? 이식성 문제 일 수 있습니까?

답변:


17

일부 역사적인 쉘은 매우 간단한 파서를 구현 [ -n = "" ]하여 첫 번째 피연산자가 =연산자처럼 보이는 위치 와 혼동되어 구문 분석 [ -n = ]하거나 구문 오류를 일으킬 수 있습니다. 에서 [ "x$1" = x"" ]1, x접두사 보장하지만 x"$1"아마도 연산자처럼, 그리고 유일한 방법은, 그래서이 테스트를 구문 분석 할 수 쉘이 치료하는 것입니다 수없는 =바이너리 연산자로.

모든 최신 쉘 및 심지어 가장 오래된 쉘은 여전히 ​​작동하고 있으며 POSIX 규칙 에 따라 최대 4 단어의 모든 테스트 표현식을 올바르게 구문 분석해야합니다. 그래서 [ -z "$1" ]경우 검사의 적절한 방법입니다 $1비어 , 그리고 [ "$x" = "$y" ]두 변수의 평등을 테스트 할 수있는 적절한 방법입니다.

현재의 일부 쉘조차도 더 긴 표현식과 혼동 될 수 있으며, 일부 표현식은 실제로 모호하기 때문에 -aand -o연산자를 사용하여 더 긴 부울 테스트를 구성하지 말고 [쉘 자체 &&||부울 연산자에 대한 별도의 호출을 사용 하십시오 .


3
역사적인 껍질 뿐만이 아닙니다 . 일부 sh상용 Unices에 기반한 일부 ksh88 은 여전히 ​​문제가 있습니다. 자세한 내용은 여기 를 참조 하십시오 .
Stéphane Chazelas

이 설명은 올바르지 않습니다. 비어있는 [ -z "$1" ]경우 적절한 테스트 방법입니다$1 . sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'-둘 다 0을 반환하지만 두 번째 경우 $1에는 존재하지 않기 때문에 비워 둘 수 없습니다.
mikeserv


3

"set -u"또는 "set -o nounset"으로 실행하면 위의 테스트에서도 오류가 발생합니다.

빈 변수를 확인하는보다 안정적인 방법은 매개 변수 확장 을 사용하는 것입니다 .

MYVAR = $ {MYVAR :- "잘못된 값"}

이 방법은 전통적인 bourne shell뿐만 아니라 ksh 및 bash에도 작동합니다.


2
나는 이것이-> M = $ {M :- "Bad Value"}라고 믿습니다
Gyan

0
    function isBlank {
 valueNoSpaces=$(echo "$@" | tr -d ' ')

 if [  "$valueNoSpaces" == null ] || [ -z "$valueNoSpaces" ] 
 then
       echo true ;
 else
       echo ""  ;
 fi
}

#Test
if [ $(isBlank "      ") ] 
then
    echo "isBlank \"      \" : it's blank"
else
    echo " isBlank \"      \": it is not blank"
fi

if [ $(isBlank "abc") ] 

then
    echo "isBlank \"abc\" : it's blank"
else
    echo "isBlank \"abc\" :it is not blank"
fi

if [ $(isBlank null) ] 
then
      echo "isBlank null : it's blank"
else
    echo "isBlank null : it is not blank"
fi

if [ $(isBlank "") ] 
then
    echo "isBlank \"\" : it's blank"
else
    echo "isBlank \"\" : it is not blank"
fi

#Result
isBlank "      " : it's blank

isBlank "abc" :it is not blank

isBlank null : it's blank

isBlank "" : it's blank

3
안녕! 나는 확실하지이 묻는 질문에 대답하는 방법이야 사용하는 =-z지금 어떻게.
dhag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.