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

Bash脚本调用Curl从数组取主机名时语法错误求助

Bash脚本语法错误排查与修复

问题描述

编写解析URL输出的Bash脚本时,硬编码URL到curl命令可正常运行,但从数组取主机名拼接URL时触发语法错误,报错信息:

line 10: syntax error near unexpected token `url1=$(curl -d "action=login&userPassword=PASSWORD" -H "Content-Type: application/x-www-form-urlencoded" -X POST $i)'

原脚本代码:

#!/usr/bin/bash
hosts=(
room-f3185-dsp
room-c5180-dsp
room-f3187-dsp
room-f3183-dsp
)

for i in "${hosts[@]}"
url1=$(curl -d "action=login&userPassword=PASSWORD" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://$i)
url2=$(echo $url | sed 's/,/\n/g')
url3=$(echo $url2 | sed 's/:/ /g' | grep macAddress ./mactest | awk '{print $2,$3,$4,$5,$6,$7,$8}')
url4=$(echo $url3 | sed 's/ /:/g' | tr -d '"')
mac=$(echo $url4 | sed 's/.$//' | sed 's/.$//' |sed 's/.$//')
echo "------------------------------------------------" >> dspmac
echo $i >> dspmac
echo "Mac Address = "$mac  >> dspmac
done

错误原因

  • for循环语法缺失:Bash的for循环必须以do关键字开启循环体,原脚本中for i in "${hosts[@]}"后直接执行语句,未添加do,导致语法解析失败。
  • 变量引用错误:url2=$(echo $url | ...)中使用了未定义的$url,实际应引用curl的输出结果$url1。
  • 逻辑错误的文件读取:grep macAddress ./mactest是读取本地mactest文件,而逻辑上应该过滤url2的输出,需去掉./mactest参数。
  • 变量未加引号:echo $url1这类写法在输出包含空格或特殊字符时会出现异常,应改为echo "$url1"。

修复后的脚本

#!/usr/bin/bash
hosts=(
room-f3185-dsp
room-c5180-dsp
room-f3187-dsp
room-f3183-dsp
)

for i in "${hosts[@]}"
do
    # 拼接URL并执行curl,添加引号避免特殊字符解析问题
    url1=$(curl -d "action=login&userPassword=PASSWORD" -H "Content-Type: application/x-www-form-urlencoded" -X POST "http://$i")
    # 修正变量引用,添加引号保证输出完整性
    url2=$(echo "$url1" | sed 's/,/\n/g')
    # 过滤curl输出中的macAddress字段,移除多余的本地文件读取
    url3=$(echo "$url2" | sed 's/:/ /g' | grep macAddress | awk '{print $2,$3,$4,$5,$6,$7,$8}')
    url4=$(echo "$url3" | sed 's/ /:/g' | tr -d '"')
    # 合并多个sed命令简化代码
    mac=$(echo "$url4" | sed 's/.$//;s/.$//;s/.$//')
    # 统一添加引号,避免输出格式异常
    echo "------------------------------------------------" >> dspmac
    echo "$i" >> dspmac
    echo "Mac Address = $mac" >> dspmac
done

额外优化建议

  • 可给curl添加-s参数静默输出,避免无关日志干扰解析。
  • 添加curl请求失败的判断逻辑(比如检查$?是否为0),防止后续步骤解析错误输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:55:19