이 연산자를 사용할 때 스크립트에 오류가 발생합니다. 온라인에 몇 가지 문서가 있는데 이중 등호가 작동해야 합니다. 어떤 아이디어가 있나요?
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이 일치하지 않는 경우 치명적인 오류가 발생합니다.
따라서 ==
명령에 대한 인수에서 쉘은 명령을 [
찾아 해당 명령이 없음을 알려달라고 요청합니다.=
$PATH
zsh
=
$ 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!