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

Linux Shell脚本if/else在bash正常运行,zsh/sh中报错求助

为什么bash脚本在sh或zsh下运行会出现[: unexpected operator错误?

这个报错的核心原因是你用了非POSIX标准的字符串比较运算符,不同shell对它的支持存在差异:

1. 运算符==的兼容性问题

  • 在Bash里,==是=的别名,用来做字符串相等比较完全没问题。
  • 但POSIX标准的sh(比如Ubuntu里的/bin/sh其实是dash的软链接)的test命令(也就是你脚本里的[)只认=作为字符串相等比较的运算符,它无法识别==,会把它当成一个意外的操作数,所以抛出unexpected operator错误。
  • 至于Zsh的情况:Zsh本身是支持==的,但当你用#!/bin/sh运行脚本,或者默认用Zsh跑但脚本没有指定bash解释器时,Zsh会切换到POSIX兼容模式(模拟sh的行为),这时候它会遵循POSIX规则,拒绝识别==,因此同样报错。

2. 修复方案

最简单的解决办法是把脚本里的==全部替换成=,这样脚本就能在sh、bash、zsh下都正常运行:

#!/bin/bash
echo "In the prompt below, type 'install' or 'remove' (without the quotes)"
echo "If you type neither, this script will terminate."
read -p "Action to perform: " OPERATION
if [ "$OPERATION" = "install" ]
then
    echo "Installing..."
    echo "Install successful!"
elif [ "$OPERATION" = "remove" ]
then
    echo "Removing..."
    echo "Remove successful!"
else
    echo "Aborting with no actions"
fi

另外补充一个细节:你脚本里的"$OPERATION"加引号是非常正确的做法——如果用户输入空值或者带空格的内容,不加引号会导致[命令因为参数数量异常而报错,加引号能避免这种情况,这也是POSIX shell脚本的最佳实践。

如果你只想保留Bash专属的语法特性,那一定要确保脚本开头的shebang是#!/bin/bash,不要改成#!/bin/sh,也不要依赖默认的Zsh运行(除非你专门适配Zsh的语法规则)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:26:00