-ge、-le、-ne。
在與其他單位做資料介接時,常會需要使用檔名做接檔的依據。
假設一個情境,有個接收資料的排程一個小時執行兩次。
排程啟動時間為 20201011142220(YYYYMMDDhhmmss),此時需要接收檔名xxx_202010111400.csv的檔案。
或是排程啟動時間為 20201011142240(YYYYMMDDhhmmss),此時需要接收檔名xxx_202010111430.csv的檔案。
意即下一個半小時間排程啟動後接受前一個半小時的字串檔名(00或30分)。
此時我們就會需要將分鐘的字串做一些處理,調整成我們需要的檔名字串。
上述之案例,通常排程的啟動時間會避開整點(00或30分),目的是也要給跟我們對接資料的單位有時間產生資料(整點執行排程會有跨天與跨小時的轉換問題這裡不討論)。
也就是我們接收資料的排程時間通常會在每個小時的1分~29分或是31~59分。
邏輯上就是,排程啟動後,取得分鐘數,將分鐘數為大於等於1小於等於29的數字轉為00(或是大於0小於30)。
程式如下,先取得目前排程啟動的時間YYYYMMDDhhmmss。
擷取分鐘的字串(第10個字元後取2個字元),利用 -ge 與 -le 判斷是否在區間,得出分鐘數須改為00或30。
最後還可以利用 -ne 判斷 兩個數字是否相同。
需要注意的是,在寫判斷式時,if [ xxx ] 間的空格一定要留,不然在執行時會出錯。
dateTime=$(date '+%Y%m%d%H%M%S')
echo 'current time: '$dateTime
minute=${dateTime:10:2}#第10個字元後取2個字元
echo 'current minute: '$minute
echo '--------------------------------------'
echo 'changing minute to 00 or 30...'
#final result
changedMinute=0
if [ $minute -ge 1 -a $minute -le 29 ]
then
changedMinute=$"00"
elif [ $minute -ge 31 -a $minute -le 59 ]
then
changedMinute=$"30"
fi
echo 'using -ge and -le: '$minute '->' $changedMinute
if [ $minute -ne $changedMinute ]
then
echo $minute ' not equal ' $changedMinute
else
echo $minute ' equal ' $changedMinute
fi