Zsh 返回 `<function>:<linenumber> = not found`

Ben*_*ers 2 zsh

我使用了在单独的脚本中定义的以下 tmux 快捷函数并设置了别名,它运行良好但很混乱。我决定将它移到.zshrc它自然属于我的地方,但遇到了一个我无法弄清楚的问题。

function t () {re='^[0-9]+$'
if [ "$1" == "kill" ]
then
        tmux kill-session -t $2
elif [[ "$1" =~ "$re" ]]
then
        tmux attach-session -d -t $1
fi}
Run Code Online (Sandbox Code Playgroud)

我获取 my .zshrc,调用该函数,然后得到:

t:1: = not found
Run Code Online (Sandbox Code Playgroud)

我知道函数是这样定义的:

??bennett@Io [~] using
??? which t
t () {
    re='^[0-9]+$'
    if [ "$1" == "kill" ]
    then
            tmux kill-session -t $2
    elif [[ "$1" =~ "$re" ]]
    then
            tmux attach-session -d -t $1
    fi
}
Run Code Online (Sandbox Code Playgroud)

我假设这是在抱怨函数的第一行。我试过将函数的第一行向下移动几行,除了错误消息所指的那一行之外,它不会改变任何东西。有什么线索吗?我在 SO 上没有找到与此特定问题相关的任何内容。

Ada*_*hon 7

命令[(or test) 仅支持单个=来检查两个字符串的相等性。使用==将导致“ = not found”错误消息。(见man 1 test

zsh具有[内置主要是出于兼容性原因。它尝试在可能的情况下实现 POSIX,以及这可能带来的所有怪癖(请参阅 Zsh 手册)。

除非您需要一个符合 POSIX 的脚本(例如为了与其他 shell 兼容),否则我强烈建议使用条件表达式,即[[ ... ]], 而不是[ ... ]. 它具有更多功能,不需要引号或其他可能为空值的解决方法,甚至允许使用算术表达式。