zsh执行带if判断的自定义函数报= not found错误原因
问题原因
这个报错是zsh和bash的条件判断语法不兼容导致的:
- 代码中
[ "$1" == "a" ]用到的==是bash给[(即test命令)做的扩展字符串比较操作符,不属于POSIX标准语法。 - zsh内置的
[命令原生不识别==操作符,解析到该行时会把==判定为待执行的命令,找不到对应命令就抛出= not found错误,函数直接中断,因此后续的ok和end都不会输出。
解决方法
两种方案任选其一修改即可:
- 方案1:将双等号
==替换为POSIX标准规定的单等号=,该写法兼容所有符合POSIX规范的shell:
function testA() { echo "start" if [ "$1" = "a" ]; then echo "ok" fi echo "end" }
- 方案2:如果习惯双等号写法,将单中括号
[ ]替换为shell原生支持的双中括号[[ ]]结构,zsh和bash都识别该结构下的==比较符,还可以省略变量外的双引号:
function testA() { echo "start" if [[ $1 == "a" ]]; then echo "ok" fi echo "end" }
修改完成后执行source ~/.zshrc重新加载配置,再运行testA a就能得到预期输出:
start ok end
内容的提问来源于stack exchange,提问作者dannyxnda
相关产品推荐
相关产品推荐

