script bash avec déclaration de cas ne renvoyant pas une sortie

J'ai écrit ce code pour faire écho à un message d'accueil en fonction de l'heure de la journée, mais quand je l'exécute, il ne montre aucune erreur mais n'apparaît pas non plus sur la command line. Pour essayer de dépanner j'ai tout commenté et fait écho juste la variable de time, qui a bien fonctionné. Alors, qu'est-ce que je fais mal?!

#!/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 

[...] introduit une class de caractères, pas un intervalle entier. Donc, [18-23] est identique à [138-2] , qui est le même que [13] , puisqu'il n'y a rien entre 8 et 2.

Vous pouvez utiliser ce qui suit comme un correctif:

 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 

Je voudrais utiliser l'évaluation arithmétique bash au lieu de l'appariement des templates.

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

La seule chose que vous devez faire attention est quand l'heure est "08" ou "09" – ce sont des nombres octaux invalides. Donc, vous devez get la date pour vous donner l'heure sans zéro principal. D'où le format %_H

[] n'utilise pas de plages numériques, il utilise des plages de caractères. Ce que vous avez, il y a quelque chose qui correspond au caractère "0" ou "1", les caractères "1" et "7", et les caractères "1" et "3". (bash ignore complètement les gammes mal formées 2-1 et 8-2.Ils sont malformés parce qu'ils ne sont pas en augmentation.) Aussi, vous avez besoin d'une finale ;; et a *) serait préférable d'attraper des erreurs logiques comme celle-ci. Je vous recommand d'utiliser une cascade de instructions if pour cela:

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