Bash:while 循环中的计时器

Vla*_*r P 3 command-line scripting bash shell-script

我的脚本中有一个 while 循环,它等待连接上线然后继续。

#!/bin/sh

while ! ping -c1 $1 &>/dev/null
        do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
Run Code Online (Sandbox Code Playgroud)

重新连接需要 25 到 45 秒。我不能让它等待超过 50 秒。限制循环工作时间的最佳解决方案是什么?

Jef*_*ler 6

一个粗略的做法是使用 bash 特殊变量 $SECONDS,它计算自 shell 启动以来的秒数。我对脚本进行了三处更改:

  1. 将 sh-bang 行从 /bin/sh 更改为 /bin/bash
  2. while测试中添加了第二个条件以将 $SECONDS 与 50 进行比较
  3. $1

新脚本:

#!/bin/bash

while ! ping -c1 "$1" &>/dev/null; [[ "$SECONDS" -lt 50 ]]
        do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
Run Code Online (Sandbox Code Playgroud)

我只想指出,在Host Found50 秒超时的情况下,该声明可能会产生误导。您可以在循环后将 $SECONDS 与 50 进行比较以确定是否发生超时。

这是 50 秒的粗略估计,因为可以使用 $SECONDS == 49 进入循环,然后ping可能需要超过一秒的时间才能成功或失败。


nst*_*022 5

没有while循环:

# -W 50 = timeout after 50 seconds
# -c 1  = 1 packet to be sent
response="$(ping -W 50 -c 1 "$1" | grep '1 
packets transmitted, 1 received')"

if [ "$response" == '' ] ; then
  echo no response after 50 seconds
else
  echo connected
fi      
Run Code Online (Sandbox Code Playgroud)