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
有時,秒數不顯示。這是為什麼?
看起來您可能同時執行了多個略有不同的腳本副本,每個副本都寫入同一個輸出文件。該腳本的至少一個執行版本沒有在其輸出中添加秒數。
至於腳本本身,我可能會給出我的看法,它擺脫了外部
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擺脫了顯式測試if
。ping
不使用(用於詳細輸出)呼叫,因為-v
無論如何我們都在丟棄輸出。