首页 > 解决方案 > 为什么像 [ $var == 'str' ] 这样的 zsh 代码作为命令运行良好,但作为脚本文件出错?

问题描述

很简单,zsh_test.sh如下:

#!/usr/bin/env zsh

if [ $USER == 'root' ]; then
    echo "root"
else
    echo "not root"
fi

标签: shellzsh

解决方案


我现在明白出了什么问题:您是一个相当晦涩的 zsh 机制的受害者,该机制在zshexpn手册页中进行了描述,称为'=' 扩展。从手册页:

如果一个单词以不带引号的 `=' 开头并且设置了 EQUALS 选项,则该单词的其余部分被视为命令的名称。如果该名称存在命令,则该单词将替换为该命令的完整路径名。

你可以用命令试试

echo ==

它也输出此错误消息。例如,在我的平台上

echo =ruby

输出/usr/bin/ruby,因为这是我安装 ruby​​ 的地方。如果您的 PATH 中有一个名为 的程序===则将解析为该路径。

虽然在==内部使用双符号是不常见[ ... ]的,但此命令的 zsh 实现允许它,但您必须引用运算符,以避免 =-expansion:

if [ $USER '==' root ]; then

另一种方法是使用[[ ... ]]。这不是一个命令,而是一个句法结构,里面的扩展规则是不同的。所以

if [[ $USER == root ]]; then

也可以。


推荐阅读