Je souhaite utiliser la commande date pour générer un jour de la semaine à partir de l'entrée utilisateur.

Je veux forcer l'entrée au format MM / JJ / AAAA.

Par exemple, sur la ligne de commande, je donne

./programname MM/DD/YYYY MM/DD/YYYY

Extraits du script lui-même

#!/bin/bash

DATE_FORMAT="^[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"

... suivi par

if [ "$DATE1" != "$DATE_FORMAT" ] || [ "$DATE2" != "$DATE_FORMAT" ]; then 
    echo -e "Please follow the valid format MM/DD/YYYY.\n" 1>&2
    exit 1

Maintenant, le problème est même lorsque j'entre les bons formats de date

./programname 11/22/2014 11/23/2014

Je reçois toujours ce message d'erreur que j'ai configuré, ce qui signifie que la condition pour if est évaluée vraie même lorsque j'entre un format valide ... des suggestions pourquoi cela se produit-il?

0
namesake22 17 janv. 2017 à 20:08

2 réponses

Meilleure réponse

Ce script semble fonctionner:

#!/bin/bash

DATE_FORMAT="^[01][0-9][/][0-3][0-9][/][0-9][0-9][0-9][0-9]$" #MM/DD/YYYY
DATE1="$1"
DATE2="$2"

if [[ "$DATE1" =~ $DATE_FORMAT ]] && [[ "$DATE2" =~ $DATE_FORMAT ]]
then echo "Both dates ($DATE1 and $DATE2) are OK"
else echo "Please follow the valid format MM/DD/YYYY ($DATE1 or $DATE2 is wrong)."
fi

Il utilise l'opérateur =~ pour une correspondance regex positive dans [[ commande de test. Les documents ne mentionnent pas un !~ pour la correspondance négative (bien que ce soit ce qu'utilisent Awk et Perl). Avec la commande de test à crochet unique [, il n'y a pas de correspondance regex. Notez que l'expression regex ne doit pas être placée entre guillemets:

Toute partie du modèle peut être citée pour forcer la partie citée à être mise en correspondance sous forme de chaîne. Les expressions entre crochets dans les expressions régulières doivent être traitées avec soin, car les caractères de guillemets normaux perdent leur signification entre crochets. Si le modèle est stocké dans une variable shell, la citation de l'expansion de la variable force le modèle entier à être mis en correspondance sous forme de chaîne.

Le test est également plus strict, rejetant 23/45/2091, parmi d'autres chaînes de date invalides.

$ bash dt19.sh  11/22/2014 11/23/2014
Both dates (11/22/2014 and 11/23/2014) are OK
$ bash dt19.sh  31/22/2014 11/43/2014
Please follow the valid format MM/DD/YYYY (31/22/2014 or 11/43/2014 is wrong).
$
2
Jonathan Leffler 17 janv. 2017 à 18:24

Code corrigé:

#!/bin/bash
DATE1="$1"
DATE2="$2"
if echo "$DATE1" | grep -q -E '[0-9][0-9][/][0-9][0-9][/][0-9][0-9][0-9][0-9]'
then 
    echo "Do whatever you want here"
    exit 1
else
    echo "Invalid date"
fi
0
Vishnu Dev 17 janv. 2017 à 18:34