왜 [[ $var ]] 대신 [[ -n $var ]]를 사용합니까?

왜 [[ $var ]] 대신 [[ -n $var ]]를 사용합니까?

존재하다이 답변다음과 같은 코드가 있습니다.

if [[ $ZSH_VERSION ]]; then

이것편집됨이 되다:

if [[ -n $ZSH_VERSION ]]; then

고쳐 쓰다:방금 편집자의 코멘트를 보았습니다.

[[ x ]]는 최근까지 zsh에서 작동하지 않았습니다.

나는 찾아보았다zsh릴리즈 노트그리고 이에 대한 참조를 찾을 수 없습니다.

어떤 zsh버전이 먼저 허용되었나요 [[ x ]]?

답변1

zsh5.5.1 문서 에서CONDITIONAL EXPRESSIONS

호환성을 위해 구문상 중요하지 않은 인수(일반적으로 변수)가 있는 경우 조건은 표현식이 길이가 0이 아닌 문자열로 확장되는지 여부를 테스트하는 것으로 처리됩니다. 즉, [[ $var ]]는 [[ -n $var ]]와 동일합니다. 가능하면 두 번째 명시적 형식을 사용하는 것이 좋습니다.

소스 트리를 이용하면,

% grep -rl 'if there is a single argument' .
./Doc/Zsh/cond.yo
% git blame ./Doc/Zsh/cond.yo | grep 'if there is a single argument'
d082827c83 (Jun T             2014-05-18 22:03:35 +0900 198) For compat...

검사 결과 git log코드 변경이 문서보다 이전에 이루어진 것으로 나타났습니다.

commit 9d47e8398d299e53ffe4e7ddf3731d2fedae9948
...
Date:   Tue May 13 08:16:50 2014 -0700

    32609: [[ $var ]] behaves as [[ -n $var ]] for bash/ksh compatibility

이 파일의 매핑을 모르지만 ChangeLog5.0.6(Thu Aug 28 19:07:04 2014 +0100)이 이러한 변경을 적용한 첫 번째 버전인 것 같습니다.git tagzsh

답변2

코드가 수행하는 작업을 더 명확하게 보여줍니다.

[[ -n $ZSH_VERSION ]]개인적으로 이 경우 는 var 값의 null 허용 여부를 테스트하고 있음을 보여주기 때문에 약간 선호합니다 .

하지만 나는 종종 스크립트에서 부울 값을 나타내는 변수를 사용하고 그에 따라 이름을 지정 is_logged_in합니다 running_in_background. 이러한 변수가 내 스크립트에 설정되어 있지 않으면 false. 이 경우에는 일반 문장처럼 이 부분이 없으면 더 잘 읽기 [[ running_in_background ]]때문에 를 사용하는 것을 선호합니다 .-n

if [[ running_in_background ]] ; then
    echo "something" | logger -t myprog
fi

하지만 제 생각에는 이것은 단지 취향의 문제이므로 편집해서는 안 됩니다.당신의암호.

관련 정보