Bash

bash腳本中日期的bash輸出

  • June 29, 2022

我寫了這個腳本:

#!/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

有時,秒數不顯示。這是為什麼?

看起來您可能同時執行了多個略有不同的腳本副本,每個副本都寫入同一個輸出文件。該腳本的至少一個執行版本沒有在其輸出中添加秒數。

至於腳本本身,我可能會給出我的看法,它擺脫了外部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格式化字元串。該參數導致在創建輸出時間戳時使用目前時間。它也不會為每個呼叫重定向一次,而是只重定向一次,用於外部循環。printf``bash``-1``printf``printf

$?程式碼通過ping直接使用 with擺脫了顯式測試ifping不使用(用於詳細輸出)呼叫,因為-v無論如何我們都在丟棄輸出。

引用自:https://unix.stackexchange.com/questions/708028