Bash

使用測試和日期比較目前小時 ro 範圍

  • December 17, 2020

我是 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)

或者,在最近發布的bashshell (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

我在這裡使用標準[ ... ]測試而不是bashshell 自己的[[ ... ]]測試,以避免將值$hour(在-geand-lt測試引入的算術上下文中)解釋為無效八進制數(08and 09)的問題。

如果你覺得你需要使用[[ ... ]]你可以測試${hour#0}而不是未修改的值$hour來避免問題。的值${hour#0}將與刪除$hour任何單個前導相同但相同。0

if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
   echo 'Good afternoon'
fi

引用自:https://unix.stackexchange.com/questions/624977