2
votes

Bash: exécutez différentes fonctions en fonction de la date

J'essaie de créer un script bash qui, lorsqu'il est exécuté, exécute un ensemble différent de commandes selon que la date se situe dans une certaine plage. Je me soucie uniquement de vérifier le jour et le mois.

Par exemple: disons que je veux un script qui me dit la saison en fonction du calendrier européen. Je lui donnerais 4 paragraphes de code au format suivant:

if date is between 01-03 and 01-06 then
    echo "It is spring"
if date is between 01-06 and 01-09 then
    echo "It is summer"
if date is between 01-09 and 01-12 then
    echo "It is autumn"
if date is between 01-12 and 01-03 then
    echo "It is winter"

Ceci est certainement réalisable en utilisant la commande date . Je ne sais tout simplement pas comment utiliser les nombres du mois et du jour dans une formule efficace pour vérifier ces plages.


2 commentaires

La journée semble inutile (en ignorant le chevauchement pour le 1er juin, le 1er septembre, le 1er décembre et le 1er mars); Par exemple, le printemps semble être n'importe quel jour du mois 3, 4 ou 5.


Pourquoi ne pas combiner le mois et le jour en un seul nombre et les comparer? Vous devrez faire quelque chose d'un peu spécial avec décembre, mais c'est simple. Mais @chepner a raison puisqu'une saison ne démarre pas en milieu de mois.


4 Réponses :


1
votes

date +% m spécifie un format qui n'aura date que le numéro du mois, vous pouvez donc l'utiliser dans vos conditions:

current_month=$(date +%m)
if [[ $current_month > 2 && $current_month < 6 ]]; then
    echo "It is spring"
...


0 commentaires

1
votes

Utilisez une instruction case pour effectuer une correspondance avec une seule chaîne composée du mois et de la date dans un format fixe.

case $(date +%m-%d) in
  03-2[2-9]|03-3*|0[4-6]-[01]*|06-2[012]) echo "spring" ;;
  06-2[2-9]|06-3*|0[7-9]-[01]*|09-2[012]) echo "summer" ;;
  09-2[2-9]|09-3*|1[012]-[01]*|12-2[012]) echo "autumn" ;;
  12-2[2-9]|12-3*|0[1-3]-[01]*|03-2[012]) echo "winter" ;;
esac


2 commentaires

Ce n'était qu'un exemple: dans mon cas d'utilisation, j'ai également besoin de la journée.


Les exemples qui ne correspondent pas à votre cas d'utilisation ne sont pas utiles.



0
votes

J'ai trouvé que pour ce dont j'avais besoin, je peux simplement estimer si c'est la première ou la seconde moitié du mois. J'ai réussi à créer un script fonctionnel en utilisant cette vérification:

current_month=$(date +%m)
current_day=$(date +%d)

if (( current_month == 1 )) && (( current_day < 16 ))
then
    # January, first half
    echo "January, first half"
elif (( current_month == 1 )) && (( current_day >= 16 ))
then
    # January, second half
    echo "January, second half"
elif (( current_month == 2 )) && (( current_day < 16 ))
then
    # February, first half
    echo "February, first half"
elif (( current_month == 2 )) && (( current_day >= 16 ))
then
    # February, second half
    echo "February, second half"
elif (( current_month == 3 )) && (( current_day < 16 ))
then
    # March, first half
    echo "March, first half"
elif (( current_month == 3 )) && (( current_day >= 16 ))
then
    # March, second half
    echo "March, second half"
elif (( current_month == 4 )) && (( current_day < 16 ))
then
    # April, first half
    echo "April, first half"
elif (( current_month == 4 )) && (( current_day >= 16 ))
then
    # April, second half
    echo "April, second half"
elif (( current_month == 5 )) && (( current_day < 16 ))
then
    # May, first half
    echo "May, first half"
elif (( current_month == 5 )) && (( current_day >= 16 ))
then
    # May, second half
    echo "May, second half"
elif (( current_month == 6 )) && (( current_day < 16 ))
then
    # June, first half
    echo "June, first half"
elif (( current_month == 6 )) && (( current_day >= 16 ))
then
    # June, second half
    echo "June, second half"
elif (( current_month == 7 )) && (( current_day < 16 ))
then
    # July, first half
    echo "July, first half"
elif (( current_month == 7 )) && (( current_day >= 16 ))
then
    # July, second half
    echo "July, second half"
elif (( current_month == 8 )) && (( current_day < 16 ))
then
    # August, first half
    echo "August, first half"
elif (( current_month == 8 )) && (( current_day >= 16 ))
then
    # August, second half
    echo "August, second half"
elif (( current_month == 9 )) && (( current_day < 16 ))
then
    # September, first half
    echo "September, first half"
elif (( current_month == 9 )) && (( current_day >= 16 ))
then
    # September, second half
    echo "September, second half"
elif (( current_month == 10 )) && (( current_day < 16 ))
then
    # October, first half
    echo "October, first half"
elif (( current_month == 10 )) && (( current_day >= 16 ))
then
    # October, second half
    echo "October, second half"
elif (( current_month == 11 )) && (( current_day < 16 ))
then
    # November, first half
    echo "November, first half"
elif (( current_month == 11 )) && (( current_day >= 16 ))
then
    # November, second half
    echo "November, second half"
elif (( current_month == 12 )) && (( current_day < 16 ))
then
    # December, first half
    echo "December, first half"
elif (( current_month == 12 )) && (( current_day >= 16 ))
then
    # December, second half
    echo "December, second half"
else
    # Error
    echo "Error: Invalid date"
fi


0 commentaires

0
votes

Voici une version beaucoup plus simple de la réponse que vous avez publiée:

June, first half

Sortie du jour:

read -r current_month current_day <<< $(date '+%B %d')

if (( current_day < 16 ))
then
    half=first
else
    half=second
fi

echo "$current_month, $half half"

Le % B Le code de format fournit le nom complet du mois du local. Utiliser read pour obtenir les deux valeurs en même temps évite le rare problème d'obtenir des dates de mois différents exactement à minuit le dernier jour du mois.

Ce script supprime un beaucoup de répétition en utilisant cette chaîne de format et en construisant par morceaux la chaîne à produire.

Dix lignes contre votre 103.


2 commentaires

Comme je l'ai dit, j'ai besoin de mon script pour exécuter un code différent en fonction de chaque combinaison. La version que j'ai postée fonctionne bien pour moi néanmoins.


@MirceaKitsune: Nous ne pouvons répondre aux questions qu'en utilisant les informations fournies. Lorsqu'un demandeur de questions donne des informations partielles, pose des questions sur autre chose que ce pour quoi il a vraiment besoin d'aide et / ou déplace la cible, cela le rend presque impossible. Les techniques que je démontre dans ma réponse améliorent considérablement DRY et peuvent être utilisées plus généralement que simplement faire écho à une chaîne.