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
相关产品推荐
相关产品推荐

