it-swarm-ko.tech

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

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

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

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

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

29
Johan

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

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

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