期望按请求头分组遍历URL的curl脚本执行顺序不符预期的问题求助
修正Bash脚本以按请求头优先顺序执行Curl命令
你的问题核心是循环嵌套顺序搞反了!原来的脚本先遍历每个URL,再对单个URL遍历所有请求头,导致每个URL先跑完所有请求头才轮到下一个URL。要实现「先统一用一个请求头跑完所有URL,再切换请求头」的逻辑,只需要把循环的内外层调换就行。
另外,读取URL文件的时候,用while read循环比for ... in $(cat)更健壮,能避免URL里有特殊字符或者空格时出现问题(虽然URL一般不会有,但养成好习惯总没错)。
给你修正后的脚本:
function myfunc { if [[ -f "allurls.txt" ]]; then # 定义要测试的请求头列表 headers_list=("X-Forwarded-For: " "X-Forwarded-Host: ") # 外层循环:先遍历每个请求头 for current_header in "${headers_list[@]}"; do # 内层循环:遍历所有URL,用while read读取文件更可靠 while IFS= read -r target_url; do # 跳过空行,避免无效请求 [[ -z "$target_url" ]] && continue # 执行curl请求 curl --silent -I --max-time 10 --url "$target_url" -H "$current_header myserver.com" done < "allurls.txt" done fi } myfunc
为什么这样改就对了?
- 外层先拿到第一个请求头
X-Forwarded-For:,然后内层循环把allurls.txt里的所有URL挨个用这个请求头跑一遍; - 等这个请求头的所有请求都执行完,外层循环才会切换到下一个请求头
X-Forwarded-Host:,再重复内层的URL遍历; IFS= read -r target_url保证URL被完整读取,不会被拆分;跳过空行的逻辑也能避免因为文件末尾有空行导致的无效curl调用。
这样执行顺序就完全符合你的预期了:先所有URL用X-Forwarded-For,再所有URL用X-Forwarded-Host。
内容的提问来源于stack exchange,提问作者sof31
相关产品推荐
相关产品推荐

