循环遍历,直到满足条件

Iterating over a loop till condition is met

提问人:Nitin Kumar 提问时间:7/31/2023 最后编辑:WillNitin Kumar 更新时间:8/2/2023 访问量:50

问:

我有一个要求,我希望我的 shell 脚本读取一个包含一些 URL 的文本文件。我希望它能在卷曲的帮助下一个接一个地击中那些人。网站可以返回“成功”或“失败”。 如果在第一次尝试中 URL 显示失败,则脚本应再次迭代并尝试命中相同的 URL,直到它显示成功,然后继续使用第二个 URL。

示例.txt

abc.com
xyz.com

我想过使用输入,但不确定它是否有效。有人可以帮我吗?until loopwhileloop

如前所述,我想到在while循环中使用直到循环,但不确定它是否有效

bash 循环 shell unix

评论

0赞 Community 7/31/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

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
是的,那会起作用。我个人更喜欢在函数之外使用这种逻辑。我已经编辑了我的答案。如果它解决了您的问题,请考虑接受它。