Caseステートメントを含むbashスクリプトは出力を返しません。

Caseステートメントを含むbashスクリプトは出力を返しません。

特定の時間に基づいてグリーティングをエコーするためにこのコードを書きましたが、実行するとエラーは表示されませんが、コマンドラインには何もエコーされません。問題を解決するために、すべての内容をコメントアウトし、時間変数のみを反映していましたが、本当にうまくいきました。それでは、私が何を間違っているのでしょうか? !

#!/bin/bash


time=$(date +%H)

case $time in
#check if its morning
    [0-11] ) echo "greeting 1";;

#check if its afternoon
    [12-17] ) echo "greeting 2";;

#check if its evening
    [18-23] ) echo "greeting 3"
esac

答え1

[...]整数範囲の代わりに文字クラスを導入します。 8と2の間に何もないのでと[18-23]同じです。[138-2][13]

次の方法を使用して問題を解決できます。

case $time in
#check if its morning
    0?|1[01] ) echo "greeting 1";;

#check if its afternoon
    1[2-7] ) echo "greeting 2";;

#check if its evening
    1[89]|2? ) echo "greeting 3"
esac

答え2

パターンマッチングの代わりにbash算術評価を使用します。

hour=$(date +%_H)
if   ((  0 <= hour && hour <= 11 )); then echo 1
elif (( 12 <= hour && hour <= 17 )); then echo 2
else echo 3
fi

注意すべき唯一のことは、時間が「08」または「09」のときです。これは無効な8進数です。したがって、date前にゼロを付けずに時間を与える必要があります。したがって、フォーマット%_H

答え3

[]数値範囲を使用せずに文字範囲を使用します。あなたが持っているのは、文字「0」または「1」、文字「1」と「7」、文字「1」と「3」と一致するものです。 (Bashは間違った範囲2-1と8-2を完全に無視します。これは増加しないので間違っています);;。そのためには、一連の説明を使用することをお勧め*)します。if

if [ "$time" -ge 0 ] && [ "$time" -le 11 ]; then
    echo Greeting 1
elif [ "$time" -ge 12 ] && [ "$time" -le 17]; then ...

関連情報