[...] introduz uma classe de caracteres, não um intervalo inteiro. Portanto, [18-23] é idêntico a [138-2] , que é o mesmo que [13] , já que não há nada entre 8 e 2.
Você pode usar o seguinte como uma correção:
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