zsh의 조건식 부분을 배우고 있는데 말이 안되는 출력이 표시됩니다.
예를 들어:
$ mkdir emptyspace && cd emptyspace
$ var_assigned_with_emptystring=""
$ [[ -n $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a nonzero-len string!'
$ [[ -n "" ]] && echo '"" is a nonzero-len string!'
$ test -n $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a nonzero-len string by test!'
var_assigned_with_emptystring is a nonzero-len string by test!
$ test -n "" && echo '"" is a nonzero-len string by test!'
----------
$ [[ -z $var_assigned_with_emptystring ]] && echo 'var_assigned_with_emptystring is a zero-len string!'
var_assigned_with_emptystring is not an empty string!
$ [[ -z "" ]] && echo '"" is a zero-len string!'
"" is a zero-len string!
$ test -z $var_assigned_with_emptystring && echo 'var_assigned_with_emptystring is a zero-len string by test!'
var_assigned_with_emptystring is a zero-len string by test!
$ test -z "" && echo '"" is a zero-len string by test!'
"" is a zero-len string by test!
with가 with 인지 option인지에 상관없이
test
with가var_assigned_with_emptystring
항상 올바른 결과를 제공하는 이유는 무엇 입니까 ? 둘러싸인 명령과 단일 조건식의 차이점은 무엇입니까 ?-n
-z
test
[[]]
""
이들그리고 그리고 의 차이점은 무엇인가요var_assigned_with_emptystring
? 매개변수는""
테스트 함수에 의해 내부적으로 처리될 때와 동일한 값 으로 확장(또는 평가)되어야 한다고 생각합니다 . 하지만test -n $var_assigned_with_emptystring
다른 반환 상태를 제공합니다test -n ""
답변1
이는 주로 다룬다.따옴표가 없는 공백 매개변수 확장이 이중 괄호 "[[" 내에서는 작동하지만 단일 괄호 "[" 내에서는 작동하지 않는 이유는 무엇입니까?. 간단히 말해서 는 [[ … ]]
다른 구문 분석 규칙을 사용하는 특수 구문인 반면 test
및 [
은 일반 명령입니다.
일반 형식 sh
( ksh
, 등 포함)에서는 bash
큰따옴표 누락으로 인해 test -n $var
값에 분할 및 와일드카드가 적용됩니다 . var
이중 괄호 안에는 이런 일이 발생하지 않습니다.
차이점 zsh
은 zsh
대부분의 경우 변수 확장에 큰따옴표를 사용할 필요가 없다는 것입니다. 그러나 목록 컨텍스트(예: 명령줄) $var
사이에는 한 가지 차이점이 있습니다 "$var"
. 단어가 비어 있고 따옴표가 없으면 zsh
제거됩니다. 따라서 인수 var
가 하나인 명령은 값이 비어 있으면 "true"이고 test -n $var
, 비어 있지 않은 인수가 하나인 명령은 "true"입니다. 그러나 두 개의 매개변수와 빈 문자열을 사용하여 "false"인 빈 문자열에 테스트를 적용하는 명령입니다.test
-n
test
test -n "$var"
test
-n
-n
내부적으로 [[ … ]]
는 null 단어 제거가 발생하지 않으므로 [[ -n $var ]]
와 는 [[ -n "$var" ]]
동일합니다.