You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Bash rm函数输入rm时报bash: [: ==: unary operator expected错误的原因及修复方法

解决bash自定义rm函数的"unary operator expected"错误

让我们一步步拆解你的问题,搞定这个报错:

你的代码里的几个关键问题

  1. 缺少空格和闭合的fi
    你写的if[ "$@" == "-u" ]; then里,if和[之间必须有空格,[和后面的变量也需要空格——因为[其实是bash里的一个命令(等同于test),必须和其他元素分开。另外,你的函数末尾漏掉了fi来闭合if语句,这也是语法问题。

  2. 用$@判断参数的误区
    $@代表所有传入的参数,当你输入不带参数的rm时,"$@"是空字符串,这时候[ "$@" == "-u" ]就变成了[ == "-u" ],bash会把==当成一元操作符,但==是二元的(需要左右两边都有值),所以就抛出了"unary operator expected"的错误。而且你的需求是判断第一个参数是不是-u,用$1(第一个参数)比$@更准确。

  3. 错误使用-eq
    -eq是用来做数值比较的,而你这里是字符串比较,所以替换成-eq完全没用,反而会因为字符串和数字比较而产生新的问题。

修正后的代码

这里有两个可行的版本:

版本1:用标准[ ]语法

rm(){
    if [ "$1" == "-u" ]; then
        echo "Do something amazing."
    else
        echo "Boring"
    fi
}

版本2:用bash更安全的[[ ]]结构(推荐)

[[ ]]是bash的内置语法,处理字符串比较时更可靠,不需要担心空值的问题,写法也更简洁:

rm(){
    if [[ "$1" == "-u" ]]; then
        echo "Do something amazing."
    else
        echo "Boring"
    fi
}

为什么之前输入rm -u正常?

当你输入rm -u时,$1就是-u,此时比较逻辑能正确触发,加上可能你输入时无意中补全了if和[之间的空格,所以代码暂时正常运行。但修正后的代码在任何参数情况(无参数、单参数、多参数)下都不会报错了。

内容的提问来源于stack exchange,提问作者Parwesh Bhaggan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:23:11