“==”逻辑运算符和 zsh 版本 5.7.x(使用 Homebrew 安装)

mrj*_*per 3 osx zsh test

使用此运算符时,我的脚本出现错误。我有一些在线文档,双等号应该可以工作。有任何想法吗?

Zsh 参考指南:http: //zsh.sourceforge.net/Doc/Release/Conditional-Expressions.html

脚本:

#!/bin/zsh

if [ $_user == "root" ]; then
    echo "root"
else
    echo "not root"
fi
Run Code Online (Sandbox Code Playgroud)

运行它:

$ ./script.sh
./script.sh:3: = not found
Run Code Online (Sandbox Code Playgroud)

小智 6

简单答案:a==是仅在内部的逻辑运算符[[ \xe2\x80\xa6 ]]

\n\n
$ [[ one == one ]] && echo "yes"\nyes\n
Run Code Online (Sandbox Code Playgroud)\n\n

它也适用于 ksh 和 bash。

\n\n

[[ \xe2\x80\xa6 ]]当在构造外部使用时,=cmd 成为文件名扩展运算符,但仅在 zsh 中

\n\n
$ echo ==\nzsh: = not found\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是更简单的内部发生的事情[ \xe2\x80\xa6 ]

\n\n

但测试运行 shell 脚本的用户是否为 root 的正确方法是:

\n\n
if (( EUID == 0 )); then\n    echo "root"\nelse\n    echo "not root"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n


Sté*_*las 5

=cmd是一个文件名扩展运算符zsh它扩展到cmd(通过查找$PATH)的路径。如果找不到这样的命令,则会导致致命错误,例如 globs 不匹配。

因此==,该[命令的一个参数是要求 shell 在其中查找=命令,$PATHzsh告诉您那里没有这样的=地方。

$ echo =ls
/bin/ls
$ echo ==
zsh: = not found
$ install -m 755 /dev/null ~/bin/=
$ echo ==
/home/stephane/bin/=
Run Code Online (Sandbox Code Playgroud)

在这里,要么使用[命令的标准语法:

[ "$_user" = root ]
Run Code Online (Sandbox Code Playgroud)

或引用=

[ "$_user" '==' root ]
Run Code Online (Sandbox Code Playgroud)

您还需要正则表达式匹配的引号:

[ "$_user" '=~' '^ro+t$' ]
Run Code Online (Sandbox Code Playgroud)

在任何情况下,您都希望引用$_user或在$_user为空或未设置时得到一些令人困惑的错误(更糟糕的是,除了zsh(like bash)之外,还包括类似Korn 的 shell 中的任意命令注入漏洞)。

您还可以通过禁用在脚本中不是很有用的equals选项 ( set +o equals) 来禁用该功能。

或者使用ksh-style[[...]]构造:

[[ $_user = root ]]
[[ $_user == root ]]
[[ $_user =~ '^ro+t$' ]]
Run Code Online (Sandbox Code Playgroud)

或者一个case构造:

case $_user in
  (root) ...
esac
Run Code Online (Sandbox Code Playgroud)

( [[ = ]],[[ == ]]case进行模式匹配(通配符,而不是正则表达式))

请注意,这些是条件表达式,无需消除赋值运算符和相等运算符之间的歧义,因此不需要==运算符。