Bash 쉘 스크립팅에서 다음 두 문장의 차이점은 무엇입니까?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
필자는 일부 스크립트에서 두 번째 스크립트를 작성하는 것을 발견했지만 여기서 사용 -z
하면 동일한 결과를 얻습니다.
두 번째 것을 사용하는 데 문제가 있다면 첫 번째 것이 조금 나아 보인다는 것을 무시해야합니까?
Bash 쉘 스크립팅에서 다음 두 문장의 차이점은 무엇입니까?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
필자는 일부 스크립트에서 두 번째 스크립트를 작성하는 것을 발견했지만 여기서 사용 -z
하면 동일한 결과를 얻습니다.
두 번째 것을 사용하는 데 문제가 있다면 첫 번째 것이 조금 나아 보인다는 것을 무시해야합니까?
답변:
[ "$1" = "" ]
및 [ -z "$1" ]
bash는 다른 POSIX 호환 쉘 정확히 동일합니다. (와 같이 단어가 아닌 문자가 아닌 경우 대괄호의 양쪽에 공백이 있어야합니다 ;
.)
[
다른 것과 마찬가지로 쉘이 내장되어 있습니다. 실제로 철자를 지정할 수도 있습니다 test
(둘 사이의 유일한 차이점 은 마지막 인수로 [
필요 하다는 것입니다 ]
). 당신이 실행하는 경우 그래서 [ "$1" = "" ]
에 $1
로 확대 -z
: 테스트 연산자는 세 개의 인수보고 -z
, =
그리고 빈 문자열을. 일부 오래된 Bourne 쉘은 완전한 표현식에 모호성이없는 경우에도 피연산자가 이런 식으로 연산자처럼 보일 때 구문 분석 오류를 발생시키는 경우가있었습니다. 실제로 어떤 버전 이이 특정 표현에 문제가 있는지는 모르지만 더 복잡한 표현은 버릴 수 있습니다. 빈 단어에 문제가있는 버전이있을 수도 있습니다. 이것들도 지원하지 않았을 것 [ -z "$1" ]
입니다. 일반적인 쉘 관용구는[ x"$1" = x"" ]
. 문자로 시작하는 연산자가 없기 때문에 피연산자가 연산자로 구문 분석 될 위험이 없습니다.
ksh, bash 및 zsh에서는 이중 괄호 구문 인을 사용할 수 있습니다 [[ -z $1 ]]
. 이 새로운 구문 (1970 년대 중반이 아니라 1980 년대 후반에 나온 것)은 일반적인 내장 기능이 아닌 특수한 구문 구조를 사용하여 피연산자가 연산자로 구문 분석되는 위험을 제거합니다. 연산자는 큰 괄호 안에 인용 부호없이 그대로 나타나야하며 변수 확장을 큰 따옴표로 묶을 필요가 없습니다.