Bash에서 [-z "$ 1"]과 [ "$ 1"= ""]가 같은 경우?


28

Bash 쉘 스크립팅에서 다음 두 문장의 차이점은 무엇입니까?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

필자는 일부 스크립트에서 두 번째 스크립트를 작성하는 것을 발견했지만 여기서 사용 -z하면 동일한 결과를 얻습니다.

두 번째 것을 사용하는 데 문제가 있다면 첫 번째 것이 조금 나아 보인다는 것을 무시해야합니까?


3
자세한 비교 는 스택 오버플로에 대한 답변 을 참조하십시오 . 또한 this and this 참조하십시오 .
추후 공지가있을 때까지 일시 중지되었습니다.

좋은 답변, 좋은 답변 :)
Johan

답변:


36

[ "$1" = "" ][ -z "$1" ]bash는 다른 POSIX 호환 쉘 정확히 동일합니다. (와 같이 단어가 아닌 문자가 아닌 경우 대괄호의 양쪽에 공백이 있어야합니다 ;.)

[다른 것과 마찬가지로 쉘이 내장되어 있습니다. 실제로 철자를 지정할 수도 있습니다 test(둘 사이의 유일한 차이점 은 마지막 인수로 [필요 하다는 것입니다 ]). 당신이 실행하는 경우 그래서 [ "$1" = "" ]$1로 확대 -z: 테스트 연산자는 세 개의 인수보고 -z, =그리고 빈 문자열을. 일부 오래된 Bourne 쉘은 완전한 표현식에 모호성이없는 경우에도 피연산자가 이런 식으로 연산자처럼 보일 때 구문 분석 오류를 발생시키는 경우가있었습니다. 실제로 어떤 버전 이이 특정 표현에 문제가 있는지는 모르지만 더 복잡한 표현은 버릴 수 있습니다. 빈 단어에 문제가있는 버전이있을 수도 있습니다. 이것들도 지원하지 않았을 것 [ -z "$1" ]입니다. 일반적인 쉘 관용구는[ x"$1" = x"" ]. 문자로 시작하는 연산자가 없기 때문에 피연산자가 연산자로 구문 분석 될 위험이 없습니다.

ksh, bash 및 zsh에서는 이중 괄호 구문 인을 사용할 수 있습니다 [[ -z $1 ]]. 이 새로운 구문 (1970 년대 중반이 아니라 1980 년대 후반에 나온 것)은 일반적인 내장 기능이 아닌 특수한 구문 구조를 사용하여 피연산자가 연산자로 구문 분석되는 위험을 제거합니다. 연산자는 큰 괄호 안에 인용 부호없이 그대로 나타나야하며 변수 확장을 큰 따옴표로 묶을 필요가 없습니다.


괄호 옆에 공백이없는 오타가 수정되었습니다.
Johan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.