"==" 논리 연산자 및 zsh 버전 5.7.x(Homebrew를 사용하여 설치)

"==" 논리 연산자 및 zsh 버전 5.7.x(Homebrew를 사용하여 설치)

이 연산자를 사용할 때 스크립트에 오류가 발생합니다. 온라인에 몇 가지 문서가 있는데 이중 등호가 작동해야 합니다. 어떤 아이디어가 있나요?

Zsh 참조 가이드:http://zsh.sourceforge.net/Doc/Release/Conditional-Expressions.html

스크립트:

#!/bin/zsh

if [ $_user == "root" ]; then
    echo "root"
else
    echo "not root"
fi

실행하세요:

$ ./script.sh
./script.sh:3: = not found

답변1

간단한 대답: a는 ==a이다논리 연산자[[ … ]]구조물 내부에서만 가능합니다 .

$ [[ one == one ]] && echo "yes"
yes

ksh 및 bash에서도 작동합니다.

[[ … ]]구조물 외부에서 사용되는 경우=cmd는 다음과 같습니다.파일 이름 확장 연산자하지만 zsh에서만

$ echo ==
zsh: = not found

[ … ]이것은 당신이 사용하는 더 간단한 구성에서 일어나는 일입니다.

그러나 쉘 스크립트를 실행하는 사용자가 루트인지 테스트하는 올바른 방법은 다음과 같습니다.

if (( EUID == 0 )); then
    echo "root"
else
    echo "not root"
fi

답변2

=cmd파일 이름 확장 연산자입니다이는 zsh경로로 확장됩니다 cmd(lookup을 통해 해결됨 $PATH). 해당 명령이 없으면 예를 들어 glob이 일치하지 않는 경우 치명적인 오류가 발생합니다.

따라서 ==명령에 대한 인수에서 쉘은 명령을 [찾아 해당 명령이 없음을 알려달라고 요청합니다.=$PATHzsh=

$ echo =ls
/bin/ls
$ echo ==
zsh: = not found
$ install -m 755 /dev/null ~/bin/=
$ echo ==
/home/stephane/bin/=

여기서는 명령의 표준 구문을 사용할 수 있습니다 [.

[ "$_user" = root ]

또는 인용문 =:

[ "$_user" '==' root ]

또한 따옴표와 일치하는 정규식이 필요합니다.

[ "$_user" '=~' '^ro+t$' ]

어쨌든 인용하고 싶습니다 $_user. 그렇지 않으면 비어 있거나 설정되지 않은 경우 혼란스러운 오류가 발생합니다 $_user(더 나쁜 것은 zsh(likebash ) 이외의 Korn 유사 쉘의 임의 명령 주입 취약점을 포함함).

비활성화 equals옵션( set +o equals)을 통해 이 기능을 비활성화할 수도 있는데, 이는 스크립트에서는 그다지 유용하지 않습니다.

또는 ksh-style [[...]]구성을 사용하십시오.

[[ $_user = root ]]
[[ $_user == root ]]
[[ $_user =~ '^ro+t$' ]]

또는 case구성:

case $_user in
  (root) ...
esac

( [[ = ]][[ == ]]패턴 case일치 수행(정규 표현식이 아닌 와일드카드))

이는 대입 연산자와 항등 연산자 사이의 명확성을 요구하지 않는 조건식이므로 연산자가 필요하지 않습니다 ==.

답변3

접선적인 짧은 답변.. 다른 쉘 유형에서 실행하기 위해 작성된 예제를 읽으셨습니까?

$ zsh -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
zsh:1: = not found

$ bash -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
equal!

관련 정보