Shell循环执行curl下载umod插件报URL格式非法错误如何解决?
报错原因
- 核心问题是条件判断语句中使用了中文全角双引号(
“/”)而非英文半角双引号("),导致Bash无法正确完成字符串匹配,甚至会将不可见的全角字符混入后续读取的插件文件名变量中,最终生成非法格式的URL触发curl报错。你之前替换为echo能输出正常URL,是因为测试时没有触发全角引号带来的变量污染,实际进入条件分支执行时变量已经被异常篡改。 - 次要潜在问题:使用
ls遍历目录获取文件名,若文件名存在空格、特殊符号时会被异常拆分,导致数组元素错误;curl调用时未给变量加引号包裹,特殊字符会被Bash解析为参数分隔符,破坏URL格式。
修复方案
直接替换为以下优化后的代码即可:
# 直接用通配符遍历目录填充数组,避免ls的特殊字符拆分问题 plugins=("$HOME"/serverfiles/oxide/plugins/*) # 提取纯文件名,去掉路径前缀 plugins=("${plugins[@]##*/}") for plugin in "${plugins[@]}" do # 跳过忽略名单,统一使用英文半角引号 if [[ "$plugin" == "CupboardLimitNotifier.cs" || "$plugin" == "ChatResponder.cs" ]] then continue fi # curl调用时变量加引号包裹,避免特殊字符导致的参数拆分问题 curl "https://umod.org/plugins/$plugin" -o "$plugin" done
优化点说明
- 放弃
ls遍历+手动计数的易出错写法,改用通配符直接填充数组,天然支持带空格、特殊字符的文件名 - 合并忽略名单判断逻辑,减少冗余代码
- 所有变量均用英文半角双引号包裹,避免Bash分词导致的参数异常
- 用for循环直接遍历数组,不需要手动维护计数变量,降低逻辑出错概率
内容的提问来源于stack exchange,提问作者lumpa
相关产品推荐
相关产品推荐

