Bash
使用測試和日期比較目前小時 ro 範圍
我是 Gnu/Linux 和 bash 的新手,我正在嘗試編寫一個簡單的 bash 腳本來測試是否
date +%H
在預定義的小時範圍內,但沒有成功。例子:
hour='date +%H' if [[ $hour -ge 12 ]] || [[ $hour -lt 19 ]] then echo "Good afternoon!"
試圖隔離一行會導致“預期的整數表達式”:
test $hour -ge 12
感覺就像我錯過了一些簡單的東西,要麼將 $hour 返回為整數,要麼將其作為字元串處理。
編輯:這是完成的腳本,在基礎層面有什麼必要的改進嗎?
!#/bin/bash name=$(whoami) hour=$(date +%H) if [ $hour -lt 5 ] || [ $hour -ge 19 ] then xmessage -center "Good evening $name!" elif [ $hour -ge 5 ] && [ $hour -lt 12 ] then xmessage -center "Good morning $name!" else xmessage -center "Good afternoon $name!" fi
您正在將文字字元串分配給
date +%H
變數hour
。要執行該
date
命令並將其輸出分配給hour
,請使用命令替換:hour=$(date +%H)
或者,在最近發布的
bash
shell (4.2+) 中,printf -v hour '%(%H)T' -1
完全不使用也會做同樣的事情
date
。此外,您需要
fi
使用if
(&&
“and”) 代替||
(“or”) 以使邏輯正確:if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then echo 'Good afternoon' fi
我在這裡使用標準
[ ... ]
測試而不是bash
shell 自己的[[ ... ]]
測試,以避免將值$hour
(在-ge
and-lt
測試引入的算術上下文中)解釋為無效八進制數(08
and09
)的問題。如果你覺得你需要使用
[[ ... ]]
你可以測試${hour#0}
而不是未修改的值$hour
來避免問題。的值${hour#0}
將與刪除$hour
任何單個前導相同但相同。0
if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then echo 'Good afternoon' fi