“==”逻辑运算符和 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

[ … ]这就是您使用的更简单的构造中发生的情况。

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

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

答案2

=cmd是文件名扩展运算符其中zsh扩展为 的路径cmd(通过查找 解析$PATH)。如果没有找到这样的命令,则会导致致命错误,例如 glob 不匹配时。

因此==,在该命令的参数中[,要求 shell 查找该=命令$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(like bash) 之外的类似 Korn 的 shell 中的任意命令注入漏洞)。

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

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

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

或者一个case构造:

case $_user in
  (root) ...
esac

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

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

答案3

切线的简短答案..也许您阅读了为在另一种 shell 类型下运行而创建的示例?

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

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

相关内容