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