獲取並設置日期及延時
延時可以用來在程序執行過程中等待一段時間(比如1秒),或是每隔幾秒鐘(或是幾個月) 監督某項任務。與時間和日期打交道需要理解如何描述並處理這兩者
日期能夠以多種格式呈現。在系統內部,日期被存儲成一個整數,其取值爲自1970年1月1
日0時0分0秒1起所流逝的秒數。這種計時方式稱爲紀元時或Unix時間。 可以在命令行中設置系統日期。
(1) 讀取日期:
$ date
Thu May 20 23:09:04 IST 2010
(2) 打印紀元時:
$ date +%s
1290047248
data命令可以將很多不同格式的日期轉換成紀元時。
將日期轉換成紀元時:
$ date --date "Wed mar 15 08:09:16 EDT 2017" +%s 1489579718
選項–date指定了作爲輸入的日期。我們可以使用任意的日期格式化選項來打印輸出。 data命令可以根據指定的日期找出這一天是星期幾:
$ date --date "Jan 20 2001" +%A
Saturday
(3) 用帶有前綴+的格式化字符串作爲date命令的參數,可以按照你的選擇打印出相應格式
$ date "+%d %B %Y"
20 May 2010
(4) 設置日期和時間:
# date -s "格式化的日期字符串"
例如:
# date -s "21 June 2009 11:01:22"
如果系統已經聯網,可以使用ntpdate來設置日期和時間:
/usr/sbin/ntpdate -s time-b.nist.gov
(5) 要優化代碼,首先得先進行測量。date命令可以用於計算一組命令所花費的執行時間:
#!/bin/bash
#文件名: time_take.sh
start=$(date +%s)
commands;
statements;
end=$(date +%s)
difference=$(( end - start))
echo Time taken to execute commands is $difference seconds.
date命令的最小精度是秒。對命令計時的另一種更好的方式是使用time命令: time commandOrScriptName.
編寫以循環方式運行的監控腳本時,設置時間間隔是必不可少的。
sleep命令可以延遲腳本執行一段時間(以秒爲單位)。下面的腳本使用tput和sleep從0開 始計時到40秒:
#!/bin/bash #文件名: sleep.sh echo Count:
tput sc
# 循環40秒
for count in `seq 0 40` do
tput rc
tput ed
echo -n $count
sleep 1
done
在上面的例子中,變量依次使用了由seq命令生成的一系列數字。我們用tput sc存儲光標 位置。在每次循環中,通過tput rc恢復之前存儲的光標位置,在終端中打印出新的count值, 然後使用tputs ed清除從當前光標位置到行尾之間的所有內容。行被清空之後,腳本就可以顯 示出新的值。sleep可以使腳本在每次循環迭代之間延遲1秒鐘。
調試
(1)使用選項-x,啓用shell腳本的跟蹤調試功能:
$ bash -x script.sh
或者使用sh -x script
(2)使用set -x和set +x對腳本進行部分調試。例如:
#!/bin/bash #文件名: debug.sh for i in {1..6}; do
set -x
echo $i
set +x
done
echo "Script executed"
在上面的腳本中,只會打印出echo $i的調試信息,因爲使用-x和+x對調試區域進行 了限制。
該腳本並沒有使用上例中的seq命令,而是用{start…end}來迭代從start到end之間 的值。這個語言構件(construct)在執行速度上要比seq命令略快。
(3) 前面介紹的調試方法是Bash內建的。它們以固定的格式生成調試信息。但是在很多情況 下,我們需要使用自定義的調試信息。可以通過定義 _DEBUG環境變量來啓用或禁止調試 及生成特定形式的信息。
請看下面的代碼:
#!/bin/bash
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..10}
do
DEBUG echo "I is $i"
done
可以將調試功能設置爲on來運行上面的腳本:
$ _DEBUG=on ./script.sh
在每一條需要打印調試信息的語句前加上DEBUG。如果沒有把 _DEBUG=on傳遞給腳 本,那麼調試信息就不會打印出來。在Bash中,命令:告訴shell不要進行任何操作。
可以在腳本中使用set builtin來啓用或禁止調試打印。
set -x:在執行時顯示參數和命令。
set +x:禁止調試。
set -v:當命令進行讀取時顯示輸入。
set +v:禁止打印輸入
把#!/bin/bash
改成 #!/bin/bash -xv
,這樣就可以啓用調試功能了。
如果每一行前面都加上+,那麼就很難在默認輸出中跟蹤執行流程了。可以將環境變量PS4
設置爲'$LINENO:'
,顯示出每行的行號:
PS4='$LINENO: '
調試的輸出信息可能會很長。如果使用了-x或set -x,調試輸出會被髮送到stderr。可以
使用下面的命令將其重定向到文件中:
sh -x testScript.sh 2> debugout.txt
Bash 4.0以及後續版本支持對調試輸出使用自定義文件描述符:
exec 6> /tmp/debugout.txt
BASH_XTRACEFD=6