如何解决fnm版本更新shell脚本出现的(standard_in) 1: syntax error错误
问题解决方法
报错根因
- 你测试用的
$insane变量值为1.0.0,包含2个小数点,而bc命令仅支持识别单小数点的数值格式,传入多小数点的字符串会直接触发语法解析错误。 - 额外风险:即便格式统一为
x.y单小数点格式,用bc做版本号比较也存在逻辑漏洞:例如版本1.10和1.2,bc会判定1.10 < 1.2,但实际版本规则中1.10是更新的版本,会导致更新逻辑错误。
修复方案
- 统一版本号格式:测试用的
insane变量要和生产环境使用的installedVersion格式保持一致,仅保留「主版本号.次版本号」两段,单小数点,例如测试时设置为insane="1.0"。 - 替换版本比较逻辑:使用专门支持版本号排序的
sort -V命令替代bc,完全兼容版本号比较规则,不会出现格式错误和逻辑漏洞。
修复后的完整代码
#!/bin/bash # 补全原代码缺失的缩进变量 spacing=" " N="" # 获取最新版本,仅保留主版本+次版本,同时清理多余引号和空格 latestVersion=$(curl -s https://api.github.com/repos/Schniz/fnm/releases/latest | grep tag_name | cut -d ":" -f2 | cut -d "," -f1 | cut -d "v" -f2 | cut -d "." -f1,2 | tr -d '"' | xargs) # 获取已安装版本,仅保留主版本+次版本 installedVersion=$(fnm -V | cut -d " " -f2 | cut -d "." -f1,2) # 测试用变量,格式和installedVersion统一,生产环境直接替换为installedVersion即可 insane="1.0" # 提示信息定义 upToDateMessage="${spacing} Your fnm version is up to date." outdatedMessage="${spacing} Your fnm version is outdated! The currently installed version is $installedVersion while the latest version is $latestVersion. Do you wish to update fnm (y/n): " echo -e "${spacing} Checking for updates...\n" # 版本比较逻辑,使用sort -V专门处理版本号规则 if [[ "$(printf '%s\n' "$latestVersion" "$insane" | sort -V | head -n1)" == "$latestVersion" ]]; then echo -e "$upToDateMessage" else read -rp "$outdatedMessage" user_input # 转小写兼容大写Y/N输入 user_input=${user_input,,} if [[ "$user_input" == "y" ]]; then echo -e "${spacing} Updating fnm..." # 移除多余的$()包裹,避免把执行输出当成命令运行 curl -fsSL https://fnm.vercel.app/install | bash elif [[ "$user_input" == "n" ]]; then echo -e "${spacing} Thanks for using this script." exit 0 else echo -e "${spacing} Invalid input! Please answer in y or n." exit 1 fi fi
额外优化说明
- 版本号取值后增加了
tr -d '"'和xargs处理,避免取到的版本号带引号或空格导致比较错误 - 修复了curl安装命令多余的
$()包裹问题,避免执行异常 - 增加了用户输入转小写逻辑,兼容大写Y/N的输入
- 补全了原代码缺失的
spacing变量定义,避免空变量报错
内容的提问来源于stack exchange,提问作者dhruvkrishnavaid
相关产品推荐
相关产品推荐

