テストと日付を使用して現在の時間範囲を比較します。

テストと日付を使用して現在の時間範囲を比較します。

私は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

答え1

date +%H変数にリテラル文字列を割り当てていますhour

このコマンドを実行してdate割り当てます。出力hourコマンド置換を使用します。

hour=$(date +%H)

または最近リリースされたbashシェル(4.2+)を介して

printf -v hour '%(%H)T' -1

それを使わずに同じことをしますdate

また、正しいロジックを取得するには、fi次の手順に従って(「or」)代わりに(「and」)をif使用する必要があります。&&||

if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
    echo 'Good afternoon'
fi

ここでは、値が無効な8進数(合計)として解釈される問題(およびテストによって導入された算術コンテキストで)を回避するために、シェルセルフテストではなく[ ... ]標準テストを使用しています。bash[[ ... ]]$hour-ge-lt0809

値を使用する必要があると思われる場合は、問題を回避するために修正せずに[[ ... ]]テストできます。の値は単一の先行を削除するのと同じです。${hour#0}$hour${hour#0}$hour0

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

答え2

((...))Bashは算術演算の構文もサポートしています。コードは次のように書き直すことができます。

#!/bin/bash

declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
    printf "Good afternoon\n"
fi

この行は、declare -i hour=$(date +%k)変数がhour算術整数として処理され、現在時刻(0〜23)がゼロなしで前に割り当てられることを指定します。

関連情報