$ 1과 $ 2가 null인지 확인하는 방법?


40

문자열 인수를 전달하는 스크립트를 실행 중이며 다음과 같이 else 문이 있으면 수행하고 싶습니다.

if [ $1 != '' ] && [ $2 != '' ]
then 
    do something.....

그러나 그것은 보여 주었다 Error too many argument. 왜?


1. 스크립트를 호출하는 명령과 2. 전체 출력을 제공해야합니다.
Lucio

2
을 사용해야합니다 [[ ]]. 그렇지 않으면 변수를 인용해야합니다.
Christophe De Troyer

$ 1이 존재하지 않으면 $ 2는 $ 1이되어 $ 1과 $ 2의 테스트는 모두 null이되는 것처럼 보이지 않습니다.
WinEunuuchs2Unix

@ WinEunuuchs2Unix 반드시 관련이있는 것은 아닙니다. 어떤 경우에는 인수에 공백 또는 널 (null) 문자열 대신 실제로 무언가가 있는지 확인하려고합니다. $1스크립트 사용자가 설정하지 않거나 null 문자열로 설정할 수 있습니다. 이 명령 순서를 고려하십시오. $ set '' bar그러면 echo "x${1}x";두 변수가 설정되지만 그 중 하나가 널입니다.
Sergiy Kolodyazhnyy

답변:


55

-z 테스트를 사용해보십시오.

if [ -z "$1" ] && [ -z "$2" ]

남자에서 bash:

-z string
   True if the length of string is zero.

그것은 나를 위해 작동합니다!
pengisgood

가장 투표가 많고 승인 된 답변이 실제로 질문에 답변하지 않는 것은 흥미 롭습니다 .
mehmet

휴대용 쉘 스크립트를 작성할 때 특정 상용 유닉스에서는이 플래그에 결함이 있으므로이 플래그를주의해서 사용해야합니다. 링크 된 소스에 대한 내 대답을 참조하십시오.
Sergiy Kolodyazhnyy

14

이 태그가 붙어 bash있으므로 확장 테스트 구문 ( [[...]]) 을 사용하고 따옴표를 잊어 버리는 것이 좋습니다 .

if [[ -z $1 && -z $2 ]]; then
...

당신이하려고하지 않는 한 sh/ POSIX 호환, 사용하지 않을 이유가 없다 [[ ]].


3

다음도 작동합니다.

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi

&&및 기타 논리적 명령 구분은 고전에서 허용되지 않습니다 test. 대신 다른 테스트 구조를 사용해야합니다 (예 -a: 생각합니다)
muru

3

이전 버전의 답변은이 답변의 두 번째 부분을 참조하십시오. 자세한 내용을 알고 싶다면

문제의 원인

문제 자체에서 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 에 따르면)의 연구에 따르면 이 플래그는 잘못되었습니다.

또한보십시오


매우 흥미로운 접근법에 +1.
WinEunuuchs2Unix

@ WinEunuuchs2Unix 더 재미있게 만들기 위해 편집 :)
Sergiy Kolodyazhnyy

1

메시지의 의도는 $ 1과 $ 2가 null이 아닌지 확인하는 것이기 때문에 게시물 제목이 정확하지 않다고 생각합니다. 주어진 예제는 $ 1과 $ 2에 큰 따옴표가 누락되었습니다. 문자열을 비교할 때 변수를 확장하려면 큰 따옴표로 묶어야합니다. 그러나 $ 1과 $ 2가 있는지 확인하는 것은 $ 1이 없으면 존재할 수 없기 때문에 $ 2가 존재하는지 확인하는 것과 같습니다. 'test'는 true / false를 반환하고 return이 0 / true 인 경우 '&&'를 'then'으로 사용하므로이 경우에도 'if'명령이 필요하지 않습니다.

[ "$2" != '' ] && commands...

-n (0이 아닌)으로 더 간단합니다.

[ -n "$2" ] && commands...

"$ 1 및 $ 2가 널인지 확인"하는 것은 매개 변수가 없는지 확인하는 것과 같습니다.

[ $# -eq 0 ] && commands...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.