Linux Shell 用法(一)6.獲取並設置日期及延時、調試

獲取並設置日期及延時

延時可以用來在程序執行過程中等待一段時間(比如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
發佈了44 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章