이전 버전의 답변은이 답변의 두 번째 부분을 참조하십시오. 자세한 내용을 알고 싶다면
문제의 원인
문제 자체에서 OP가보고하는 것으로보고되었으며 too many arguments error
, 테스트 할 때 bash
그렇지 않은 것으로 보입니다.
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
함께 /bin/sh
하는 사실에 심볼릭 링크되어 /bin/dash
다음과 같이 우분투, 오류보고 :
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
그리고 독립형 /bin/test
도 :
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
(!) 참고 : 당신이 무엇인지 궁금해하는 경우 /usr/bin/test
왜 내가 사용 bash
하고 sh
그 다음 당신이 알아야 할, [
대한 별칭 test
도 독립 실행 또는 더 일반적으로 존재 명령 - 셸 내장 된 각 쉘 처음 사용하는 것입니다 . if
진술에 관해서는 , 그들은 명령의 출구 조각상에서 작동하므로 그 이유 [
와 test
명령은 그 명령에 대한 인수가됩니다. 명령 행 인수의 부적절한 순서는 오류를 초래합니다.
주제로 돌아 가기 : OP가 어떻게 관련되지 않은 오류가 발생했는지는 확실하지 않습니다. 그러나 세 가지 경우 모두 문제는 동일합니다. 설정되지 않은 변수는 비어있는 것으로 취급되므로 셸에서 인용되지 않은 변수로 보는 것은
[ != '' ]
test
이해 하는 구문을 깨뜨립니다. 명령 줄 인수의 순서가 잘못되었다는 것을 기억하십니까? 따라서 인용이 중요한 이유. 진단 출력을 활성화하고 어떤 쉘이 실행되는지 봅시다 :
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
설정되지 않은 변수를 테스트하는 더 좋은 방법
당신이 볼 매우 빈번한 접근 방식은 다음과 같습니다.
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
질 을 인용하려면 :
[ "x $ 1"= "x"]에서 x 접두어는 x "$ 1"이 연산자처럼 보이지 않을 수 있으므로 쉘이이 테스트를 구문 분석 할 수있는 유일한 방법은 =를 이항 연산자로 취급하는 것입니다.
아마도 이것들은 /bin/sh
스크립트 에서 보았 기 때문에 상당히 이식성이 좋을 것 입니다. 또한 같이 결합 될 수 있습니다
if [ "x${var1}${var2}" == "x" ]; then
...
fi
물론 우리는 -z
플래그를 사용할 수 있지만 일부 쉘, 특히 ksh88 ( Stephane Chazelas 에 따르면)의 연구에 따르면 이 플래그는 잘못되었습니다.
또한보십시오