提问人:Nitin Kumar 提问时间:7/31/2023 最后编辑:WillNitin Kumar 更新时间:8/2/2023 访问量:50
循环遍历,直到满足条件
Iterating over a loop till condition is met
问:
我有一个要求,我希望我的 shell 脚本读取一个包含一些 URL 的文本文件。我希望它能在卷曲的帮助下一个接一个地击中那些人。网站可以返回“成功”或“失败”。 如果在第一次尝试中 URL 显示失败,则脚本应再次迭代并尝试命中相同的 URL,直到它显示成功,然后继续使用第二个 URL。
示例.txt
abc.com
xyz.com
我想过使用输入,但不确定它是否有效。有人可以帮我吗?until loop
while
loop
如前所述,我想到在while循环中使用直到循环,但不确定它是否有效
答:
1赞
Will
7/31/2023
#1
使用 until 循环:
#!/bin/bash
retry_timer=5
success_timer=120
function check_url_success() {
local url=$1
local response=$(curl -s /dev/null "$url")
if [ "$response" == "success" ]; then
return 0
else
return 1
fi
}
urls=()
while IFS= read -r url; do
urls+=("$url")
done < "sample.txt"
for url in "${urls[@]}"; do
echo "Trying $url..."
until check_url_success "$url"; do
echo "Failed. Retrying..."
sleep $retry_timer # Add a delay before retrying
done
echo "Success for $url!"
sleep $success_timer # Add a delay of 2 min when curl ping succeeded
done
评论
0赞
Nitin Kumar
8/1/2023
嗨,威尔,感谢您的回复。1 怀疑。脚本中的睡眠 5 是在重试之前。我想在第一个 url 成功后添加 2 分钟的睡眠时间。为此,我可以在返回 0 之前将其添加到函数中吗?function check_url_success() { local url=$1 local response=$(curl -s /dev/null “$url”) if [ “$response” == “success” ]; then sleep 2m return 0 else return 1 fi
0赞
Will
8/2/2023
是的,那会起作用。我个人更喜欢在函数之外使用这种逻辑。我已经编辑了我的答案。如果它解决了您的问题,请考虑接受它。
评论