변수가 비어 있는지 테스트하기 위해 많은 다른 쉘에서 다음 기술을 여러 번 사용하는 것을 보았습니다.
if [ "x$1" = "x" ]; then
# Variable is empty
fi
보다 표준적인 것보다 이것을 사용하면 어떤 이점이 if [ -z "$1" ]
있습니까? 이식성 문제 일 수 있습니까?
답변
일부 역사적인 쉘은 매우 간단한 파서를 구현 [ -n = "" ]
하여 첫 번째 피연산자가 =
연산자처럼 보이는 위치 와 혼동되어 구문 분석 [ -n = ]
하거나 구문 오류를 일으킬 수 있습니다. 에서 [ "x$1" = x"" ]
1, x
접두사 보장하지만 x"$1"
아마도 연산자처럼, 그리고 유일한 방법은, 그래서이 테스트를 구문 분석 할 수 쉘이 치료하는 것입니다 수없는 =
바이너리 연산자로.
모든 최신 쉘 및 심지어 가장 오래된 쉘은 여전히 작동하고 있으며 POSIX 규칙 에 따라 최대 4 단어의 모든 테스트 표현식을 올바르게 구문 분석해야합니다. 그래서 [ -z "$1" ]
경우 검사의 적절한 방법입니다 $1
비어 , 그리고 [ "$x" = "$y" ]
두 변수의 평등을 테스트 할 수있는 적절한 방법입니다.
현재의 일부 쉘조차도 더 긴 표현식과 혼동 될 수 있으며, 일부 표현식은 실제로 모호하기 때문에 -a
and -o
연산자를 사용하여 더 긴 부울 테스트를 구성하지 말고 [
쉘 자체 &&
및 ||
부울 연산자에 대한 별도의 호출을 사용 하십시오 .
답변
에 따르면 http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html 의 -z
테스트는 일부 구현에서 안전하지 않은 “흥미로운”문자열이 좋아 아마 때, "-o a=a"
테스트됩니다.
답변
“set -u”또는 “set -o nounset”으로 실행하면 위의 테스트에서도 오류가 발생합니다.
빈 변수를 확인하는보다 안정적인 방법은 매개 변수 확장 을 사용하는 것입니다 .
MYVAR = $ {MYVAR :- “잘못된 값”}
이 방법은 전통적인 bourne shell뿐만 아니라 ksh 및 bash에도 작동합니다.
답변
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