bash 脚本中日期的 Bash 输出

bash 脚本中日期的 Bash 输出

我写了这个脚本:

#!/bin/bash
target="1.1.1.1"
while true;
do
        ping $target -c 1 -v > /dev/null
        if [[ $? -ne 0 ]]; then
                echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
        fi
        sleep 5s
done

它工作得几乎完美,只有一个问题。在输出文件中netStabilityLog,我得到:

28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51

有时,秒数不会显示。这是为什么?

答案1

看来您可能同时运行了多个略有不同的脚本副本,每个副本都写入同一个输出文件。至少有一个正在运行的脚本版本没有在其输出中添加秒数。

至于脚本本身,我可以给出我的看法,它摆脱了外部date实用程序,并且以不同的方式进行条件输出和重定向。它还整理了丢失的引用。

#!/bin/bash

ipaddr=1.1.1.1

while true; do
    if ! ping -c 1 "$ipaddr" >/dev/null 2>&1
    then
        printf '%(%d/%m/%y %T)T\n' -1
    fi
    sleep 5
done >>netStabilityLog

这使用4.2 版本中引入的%(...)T格式化字符串。该参数导致在创建输出时间戳时使用当前时间。它也不会针对每个调用进行重定向,而是仅针对外循环重定向一次。printfbash-1printfprintf

$?该代码通过直接使用pingwith来摆脱显式测试if。不会ping调用 with -v(用于详细输出),因为我们无论如何都会丢弃输出。

相关内容