shell - 为什么像 [ $var == 'str' ] 这样的 zsh 代码作为命令运行良好,但作为脚本文件出错?
问题描述
很简单,zsh_test.sh
如下:
#!/usr/bin/env zsh
if [ $USER == 'root' ]; then
echo "root"
else
echo "not root"
fi
将上述代码复制并粘贴到 zsh shell 中,它执行得很好。
$ #!/usr/bin/env zsh $ if [ $USER == 'root' ]; then then> echo "root" then> else else> echo "not root" else> fi not root
但是直接执行脚本文件
zsh_test.sh
,出错了。$ ./zsh_test.sh ./zsh_test.sh:3: = not found
解决方案
我现在明白出了什么问题:您是一个相当晦涩的 zsh 机制的受害者,该机制在zshexpn手册页中进行了描述,称为'=' 扩展。从手册页:
如果一个单词以不带引号的 `=' 开头并且设置了 EQUALS 选项,则该单词的其余部分被视为命令的名称。如果该名称存在命令,则该单词将替换为该命令的完整路径名。
你可以用命令试试
echo ==
它也输出此错误消息。例如,在我的平台上
echo =ruby
输出/usr/bin/ruby
,因为这是我安装 ruby 的地方。如果您的 PATH 中有一个名为 的程序=
,==
则将解析为该路径。
虽然在==
内部使用双符号是不常见[ ... ]
的,但此命令的 zsh 实现允许它,但您必须引用运算符,以避免 =-expansion:
if [ $USER '==' root ]; then
另一种方法是使用[[ ... ]]
。这不是一个命令,而是一个句法结构,里面的扩展规则是不同的。所以
if [[ $USER == root ]]; then
也可以。
推荐阅读
- tensorboard - 如何在张量板上显示数值
- plotly-dash - 根据特定条件对散点图点进行不同的着色
- azure-cdn - Azure CDN 响应奇怪的结果
- android - 在BarChart MPAndroidChart中垂直旋转值文本
- c# - 使用 LDAP(在 c# 中)从 AD 绑定用户详细信息需要时间 --13 分钟,大约 7500 条记录。需要代码建议以提高性能
- javascript - 在循环内仅显示一次该项目
- three.js - 未捕获(承诺中)类型错误:无法读取未定义的属性“几何”
- ios - 如果用户在 iOS swift 中拒绝位置权限,如何手动访问用户位置
- javascript - 画布 - 刷新不像我预期的那样工作
- ruby - Minitest 中不可见的模块类描述