使用此运算符时,我的脚本出现错误。我有一些在线文档,双等号应该可以工作。有任何想法吗?
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\nRun Code Online (Sandbox Code Playgroud)\n\n它也适用于 ksh 和 bash。
\n\n[[ \xe2\x80\xa6 ]]当在构造外部使用时,=cmd 成为文件名扩展运算符,但仅在 zsh 中
$ echo ==\nzsh: = not found\nRun 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\nRun 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进行模式匹配(通配符,而不是正则表达式))
请注意,这些是条件表达式,无需消除赋值运算符和相等运算符之间的歧义,因此不需要==运算符。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |