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