Bash에서는 if [ -z "$1" ] 와 if [ "$1" = "" ] 가 동일합니까?

Bash에서는 if [ -z "$1" ] 와 if [ "$1" = "" ] 가 동일합니까?

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

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

나는 일부 대본에서 두 번째 대본을 작성하고 있는 것을 발견했습니다.여기를 사용해도 -z동일한 효과를 얻을 수 있습니다 .

두 번째 것을 사용하는 것이 문제가 된다면, 더 보기 좋게 만들기 위해 첫 번째 것을 무시해야 할까요?

답변1

[ "$1" = "" ][ -z "$1" ]Bash 및 기타 POSIX 호환 쉘에서도 동일하게 작동합니다 . (단어를 형성하지 않는 문자(예: )가 없는 한 대괄호 양쪽에 공백이 있어야 합니다 ;.)

[다른 쉘과 마찬가지로 내장 쉘입니다. 실제로 철자를 입력할 수도 있습니다 test(둘 사이의 유일한 차이점은 마지막 인수로 [a가 필요하다는 것입니다). ]따라서 확장 프로그램을 로 실행하면 [ "$1" = "" ]테스트 연산자는 세 개의 매개변수와 빈 문자열을 확인합니다. 다소 나이가 많음$1-z-z=전체 표현식에 모호함이 없음에도 불구하고 피연산자가 이런 식으로 연산자처럼 보일 때 쉘은 때때로 구문 분석 오류를 발생시킵니다. 실제로 어떤 버전에 이 특정 표현에 문제가 있는지는 모르겠지만 더 복잡한 표현으로 인해 실패할 수 있습니다. 버그가 있는 일부 버전도 지원되지 않을 수 있습니다 [ -z "$1" ]. 일반적인 쉘 관용구는 입니다 [ x"$1" = x"" ]. 연산자가 문자로 시작하지 않으므로 피연산자를 연산자로 구문 분석할 위험이 없습니다.

ksh, bash 및 zsh에서는 이중 대괄호 구문을 사용할 수 있습니다 [[ -z $1 ]]. 이 최신 구문(1970년대 중반이 아닌 1980년대 후반)에서는 연산자 위험으로 일반 내장 구문 대신 특수 구문 구성을 사용하여 피연산자를 구문 분석할 필요가 없습니다. . 연산자는 문자 그대로 나타나야 하며 이중 괄호 안에 따옴표가 없어야 하며 큰 따옴표로 묶인 변수 확장이 필요하지 않습니다.

관련 정보