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

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

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

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

보다 공식적인 접근 방식에 비해 이를 사용하면 어떤 이점이 있습니까 if [ -z "$1" ]? 이것이 이식성 문제일까요?

답변1

[ -n = "" ]일부 역사적 쉘은 연산자처럼 보이는 첫 번째 피연산자와 혼동하여 =이를 구문 분석하거나 [ -n = ]구문 오류를 일으킬 수 있는 매우 간단한 파서를 구현했습니다. 에서 접두사는 연산자처럼 보이는 것이 불가능하도록 보장하므로 [ "x$1" = x"" ]쉘 이 이 테스트를 구문 분석할 수 있는 유일한 방법은 이를 이진 연산자로 처리하는 것입니다.xx"$1"=

모든 현대식 포탄, 그리고 아직 작동 중인 대부분의 오래된 포탄도 다음과 같습니다.POSIX 규칙올바르게 구문 분석하려면 최대 4단어까지의 모든 테스트 표현식이 필요합니다. 그래서[ -z "$1" ]$1비어 있는지 테스트하는 올바른 방법입니다., [ "$x" = "$y" ]두 변수의 동등성을 테스트하는 올바른 방법입니다.

일부 현재 셸은 더 긴 표현식과 혼동될 수 있으며 일부 표현식은 실제로 모호하므로 더 긴 부울 테스트를 구성하기 위해 -aand 연산자를 사용하지 말고 대신 별도의 호출 셸 소유 및 부울 연산자를 사용하세요.-o[&&||

답변2

~에 따르면http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html, -z테스트는일부 구현에서는 안전하지 않음"-o a=a", 아마도 "흥미로운" 문자열을 테스트할 때일 것입니다.

답변3

위 테스트는 "set -u" 또는 "set -o nounset"을 사용하여 실행하는 경우에도 오류가 발생합니다.

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

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

이 방법은 전통적인 Bourne Shell, ksh 및 bash에서 작동합니다.

답변4

    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

관련 정보