使用此运算符时,我的脚本出现错误。我有一些在线文档,双等号应该可以工作。有任何想法吗?
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 ]]
。
$ [[ one == one ]] && echo "yes"\nyes\n
Run Code Online (Sandbox Code Playgroud)\n\n它也适用于 ksh 和 bash。
\n\n[[ \xe2\x80\xa6 ]]
当在构造外部使用时,=cmd 成为文件名扩展运算符,但仅在 zsh 中
$ echo ==\nzsh: = not found\n
Run Code Online (Sandbox Code Playgroud)\n\n这就是更简单的内部发生的事情[ \xe2\x80\xa6 ]
。
但测试运行 shell 脚本的用户是否为 root 的正确方法是:
\n\nif (( EUID == 0 )); then\n echo "root"\nelse\n echo "not root"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n
=cmd
是一个文件名扩展运算符,zsh
它扩展到cmd
(通过查找$PATH
)的路径。如果找不到这样的命令,则会导致致命错误,例如 globs 不匹配。
因此==
,该[
命令的一个参数是要求 shell 在其中查找=
命令,$PATH
并zsh
告诉您那里没有这样的=
地方。
$ 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
进行模式匹配(通配符,而不是正则表达式))
请注意,这些是条件表达式,无需消除赋值运算符和相等运算符之间的歧义,因此不需要==
运算符。