답변:
일부 역사적인 쉘은 매우 간단한 파서를 구현 [ -n = "" ]
하여 첫 번째 피연산자가 =
연산자처럼 보이는 위치 와 혼동되어 구문 분석 [ -n = ]
하거나 구문 오류를 일으킬 수 있습니다. 에서 [ "x$1" = x"" ]
1, x
접두사 보장하지만 x"$1"
아마도 연산자처럼, 그리고 유일한 방법은, 그래서이 테스트를 구문 분석 할 수 쉘이 치료하는 것입니다 수없는 =
바이너리 연산자로.
모든 최신 쉘 및 심지어 가장 오래된 쉘은 여전히 작동하고 있으며 POSIX 규칙 에 따라 최대 4 단어의 모든 테스트 표현식을 올바르게 구문 분석해야합니다. 그래서 [ -z "$1" ]
경우 검사의 적절한 방법입니다 $1
비어 , 그리고 [ "$x" = "$y" ]
두 변수의 평등을 테스트 할 수있는 적절한 방법입니다.
현재의 일부 쉘조차도 더 긴 표현식과 혼동 될 수 있으며, 일부 표현식은 실제로 모호하기 때문에 -a
and -o
연산자를 사용하여 더 긴 부울 테스트를 구성하지 말고 [
쉘 자체 &&
및 ||
부울 연산자에 대한 별도의 호출을 사용 하십시오 .
[ -z "$1" ]
경우 적절한 테스트 방법입니다$1
. sh -c '[ -z "$1" ]' ''; sh -c '[ -z "$1" ]'
-둘 다 0을 반환하지만 두 번째 경우 $1
에는 존재하지 않기 때문에 비워 둘 수 없습니다.
에 따르면 http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html 의 -z
테스트는 일부 구현에서 안전하지 않은 "흥미로운"문자열이 좋아 아마 때, "-o a=a"
테스트됩니다.
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
=
대 -z
지금 어떻게.
sh
상용 Unices에 기반한 일부 ksh88 은 여전히 문제가 있습니다. 자세한 내용은 여기 를 참조 하십시오 .