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

Zsh脚本检测OS时出现'= not found'错误,求原因分析

问题:Zsh脚本检测操作系统时出现load_config:3: = not found错误

我想用Zsh脚本检测操作系统并加载对应配置,但运行脚本时出现难以理解的load_config:3: = not found错误,错误信息极少无法明确原因。脚本代码及运行日志如下:

原脚本代码

function load_config(){
  os=$(uname -a)
  echo $os
  if [[`echo $os | grep -o kali | tail -1` == "kali"]]; then
    for FILE in ~/.config/zsh_config/kali/*.zsh; do
      source $FILE
    done
  elif [[`echo $os | grep -o MANJARO | tail -1` == "MANJARO"]]; then
    for FILE in ~/.config/zsh_config/manjaro/*.zsh; do
      source $FILE
    done
  elif [[`echo $os | grep -o MacBook | tail -1` == "MacBook"]]; then
    for FILE in ~/.config/zsh_config/osx/*.zsh; do
      source $FILE
    done
  else
    echo 'Unknown OS!'
  fi
}

运行日志

$ load_config 
Linux kali 5.18.0-kali5-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.5-1kali5 (2022-07-04) x86_64 GNU/Linux
load_config:3: = not found

错误原因

这个错误是**[[ 和反引号()之间缺少空格**导致的。Zsh中[[`是语法关键字,必须和后续表达式保留空格,否则会被解析成一个不存在的命令`[[`(把`[[`和后面的反引号内容连在一起),同时后面的`==`会被错误拆分,最终触发"= not found"的错误。


修复后的脚本

function load_config(){
  os=$(uname -a)
  echo $os
  # 给[[后添加空格,同时用$()替代反引号提升可读性
  if [[ $(echo $os | grep -o kali | tail -1) == "kali" ]]; then
    for FILE in ~/.config/zsh_config/kali/*.zsh; do
      source $FILE
    done
  elif [[ $(echo $os | grep -o MANJARO | tail -1) == "MANJARO" ]]; then
    for FILE in ~/.config/zsh_config/manjaro/*.zsh; do
      source $FILE
    done
  elif [[ $(echo $os | grep -o MacBook | tail -1) == "MacBook" ]]; then
    for FILE in ~/.config/zsh_config/osx/*.zsh; do
      source $FILE
    done
  else
    echo 'Unknown OS!'
  fi
}

额外优化建议

  • 用$()替代反引号:反引号在嵌套使用时容易出现语法问题,$()的可读性和兼容性更优
  • 简化系统检测逻辑:可以直接用uname -s获取内核名称,或者lsb_release -i获取发行版信息,避免依赖uname -a中的可变字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:40:40