변수가 비어 있는지 테스트하기 위해 다양한 쉘에서 다음 기술이 여러 번 사용되는 것을 보았습니다.
if [ "x$1" = "x" ]; then
# Variable is empty
fi
보다 공식적인 접근 방식에 비해 이를 사용하면 어떤 이점이 있습니까 if [ -z "$1" ]
? 이것이 이식성 문제일까요?
답변1
[ -n = "" ]
일부 역사적 쉘은 연산자처럼 보이는 첫 번째 피연산자와 혼동하여 =
이를 구문 분석하거나 [ -n = ]
구문 오류를 일으킬 수 있는 매우 간단한 파서를 구현했습니다. 에서 접두사는 연산자처럼 보이는 것이 불가능하도록 보장하므로 [ "x$1" = x"" ]
쉘 이 이 테스트를 구문 분석할 수 있는 유일한 방법은 이를 이진 연산자로 처리하는 것입니다.x
x"$1"
=
모든 현대식 포탄, 그리고 아직 작동 중인 대부분의 오래된 포탄도 다음과 같습니다.POSIX 규칙올바르게 구문 분석하려면 최대 4단어까지의 모든 테스트 표현식이 필요합니다. 그래서[ -z "$1" ]
$1
비어 있는지 테스트하는 올바른 방법입니다., [ "$x" = "$y" ]
두 변수의 동등성을 테스트하는 올바른 방법입니다.
일부 현재 셸은 더 긴 표현식과 혼동될 수 있으며 일부 표현식은 실제로 모호하므로 더 긴 부울 테스트를 구성하기 위해 -a
and 연산자를 사용하지 말고 대신 별도의 호출 셸 소유 및 부울 연산자를 사용하세요.-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