如何解决curl: (6) Couldn't resolve host错误?循环API调用异常排查
问题分析与解决方案
这个问题的根源很明确——Shell中的单引号会完全阻止变量展开!你在curl命令里用单引号包裹了包含环境变量的部分,导致Bash没有把$SERVERPROTOCOL、$USERNAME这些变量替换成实际值,curl直接把$SERVERPROTOCOL:当成了主机名的一部分,自然会抛出"无法解析主机"的错误。
修改后的脚本
我把需要展开变量的部分换成了双引号(同时修正了你脚本里USERPASS漏写$的小问题):
for pi in $(cat $halted_pid);do # write PID to console so user knows script is working echo echo "cancelling process instance - $pi" # 2>&1 to include any output on stderr curl -X DELETE -k -H 'Content-Type: application/xml' -H 'Accept: application/xml' -u "$USERNAME:$USERPASS" -i "$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi" 2>&1 | tee -a $halted_pi_cancellation_logfile done
关键修改点说明
- 认证部分:把
-u '$USERNAME:USERPASS'改成-u "$USERNAME:$USERPASS"
双引号会让Shell正常展开变量,同时如果密码里包含!、@这类特殊字符,双引号也能正确处理(只要特殊字符不是双引号本身)。 - URL部分:把单引号包裹的URL换成
"$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi"
这样$SERVERPROTOCOL、$SERVERHOST、$SERVERPORT和循环变量$pi都会被替换成实际值,生成正确的请求地址。
额外优化建议
如果你的$halted_pid文件里存在空行或者PID包含空格(虽然可能性低),用$(cat $halted_pid)读取内容可能会出现错误分割的情况,更稳妥的写法是用while read循环:
while read -r pi; do # 跳过空行 [[ -z "$pi" ]] && continue echo echo "cancelling process instance - $pi" curl -X DELETE -k -H 'Content-Type: application/xml' -H 'Accept: application/xml' -u "$USERNAME:$USERPASS" -i "$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi" 2>&1 | tee -a "$halted_pi_cancellation_logfile" done < "$halted_pid"
内容的提问来源于stack exchange,提问作者Ranjeet
相关产品推荐
相关产品推荐

