【问题标题】:Using shell, how to skip to next element in a for loop?使用shell,如何跳到for循环中的下一个元素?
【发布时间】:2020-01-06 16:34:34
【问题描述】:

这是我的脚本应该做的:它 ping 5 次导入文本文件的每一行的 IP 地址。如果 5 次中有 3 次 IP 无法访问,它会回显“它已关闭!”并且(应该)继续下一个 IP ......除了我不知道如何配置这个“跳过”部分。 这是我当前的代码:

FILE=file.txt
unreachableIP=0

while IFS='' read -r line || [ -n "$line" ]; do
    set -- $line

    for (( i=1; i<=5; i++ ))
    do
        echo "Ping $1 $i times"
        ping -c 1 $1
        if [ "$?" = 0 ]
        then
            echo "reachable"
        else
            echo "unreachable"
            ((unreachableIP++))
            echo $unreachableIP
            if [ $unreachableIP -eq 3 ]
            then
                echo "it's down!"
                unreachableIP=0
            fi
        fi
    done
done < $FILE

示例:如果 IP 地址第 1 次可访问,第 2 次无法访问,第 3 次无法访问,第 4 次无法访问,我希望脚本移动到下一个 IP(下一行),而不是第 5 次尝试 ping。 这是file.txt

8.8.8.8 GoogleDNS
1.1.1.1 CloudFlareDNS
213.1.1.1 SomeFakeIPForDebug

感谢您的帮助。

编辑:我不想使用 break 因为它也会停止 ping 其他 IP...我希望它只停止 ping 当前 IP。

【问题讨论】:

  • 使用read -r ip line;那么您根本不需要使用set,而是使用$ip 代替$1

标签: linux shell


【解决方案1】:

继续

break 和 continue 循环控制命令 [1] 完全对应于它们在其他编程语言中的对应部分。 break 命令终止循环 >(从中中断),而 continue 导致跳转到循环的下一次迭代,>跳过该特定循环循环中的所有剩余命令。

http://tldp.org/LDP/abs/html/loopcontrol.html

【讨论】:

  • 据我了解,这是关于打破循环,而不是“跳过当前事件”。
  • 是的没错,我回答了问题,并没有提供代码的解决方案
【解决方案2】:

使用break 来实现您所说的“跳过”功能。

例如

if [ "$unreachableIP" -eq 3 ]; then
   break
fi

它将退出当前循环。

【讨论】:

  • 如果我使用break,它确实会退出循环,然后不ping其他IP...我希望它继续ping其他IP。
  • @a_v_e_ break 应该只跳出内部 for 循环,而不是外部 while 循环。
  • @a_v_e_ break 只会中断 current 循环,因此while 循环仍将继续
猜你喜欢
  • 2021-07-11
  • 2014-01-08
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多