Vérifier si une chaîne correspond à une expression régulière dans un script Bash

L’un des arguments yyyymmdd mon script est une date au format suivant: yyyymmdd .

Je veux vérifier si je reçois une date valide en entrée.

Comment puis-je faire ceci? J’essaie d’utiliser une regex comme: [0-9]\{\8}

Tu peux dire:

 [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" 

Ou plus précis:

 [[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes" # |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ | # | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ | # | | | | | # | | \ | | # | --year-- --month-- --day-- | # | either 01...09 either 01..09 end of line # start of line or 10,11,12 or 10..29 # or 30, 31 

En d’autres termes, vous pouvez définir une expression régulière en bash correspondant au format souhaité. De cette façon, vous pouvez faire:

 [[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match" 

Notez que ceci est basé sur la solution d’Aleks-Daniel Jakimenko dans la vérification du format de date d’entrée utilisateur dans bash .


Dans les coquillages tels que sh ou fish – moins équipés alors bash – vous pouvez utiliser grep :

 (echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match" 

En bash version 3, vous pouvez utiliser l’opérateur ‘= ~’:

 if [[ "$date" =~ "[0-9]\{8\}" ]]; then echo "Valid date" else echo "Invalid date" fi 

Référence: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

Remarque: la citation dans l’opérateur correspondant dans les doubles crochets, [[]], n’est plus nécessaire à partir de la version 3.2 de Bash

Un bon moyen de tester si une chaîne est une date correcte consiste à utiliser la date de commande:

 if date -d "${DATE}" >/dev/null 2>&1 then # do what you need to do with your date else echo "${DATE} incorrect date" >&2 exit 1 fi 

J’utiliserais expr match au lieu de =~ :

 expr match "$date" "^[0-9]\{8\}" >/dev/null && echo yes 

C’est mieux que la réponse actuellement acceptée d’utiliser =~ car =~ correspondra également aux chaînes vides, ce qui ne devrait pas être le cas. Supposons que badvar n’est pas défini, alors [[ "1234" =~ "$badvar" ]]; echo $? [[ "1234" =~ "$badvar" ]]; echo $? donne (incorrectement) 0 , alors que expr match "1234" "$badvar" >/dev/null ; echo $? expr match "1234" "$badvar" >/dev/null ; echo $? donne un résultat correct 1 .

Nous devons utiliser >/dev/null pour masquer la valeur de sortie de expr match , qui correspond au nombre de caractères correspondants ou 0 si aucune correspondance n’a été trouvée. Notez que sa valeur de sortie est différente de son état de sortie . Le statut de sortie est 0 s’il y a une correspondance trouvée, ou 1 sinon.

En règle générale, la syntaxe de expr est la suivante:

 expr match "$ssortingng" '$subssortingng' 

Ou:

 expr "$ssortingng" : '$subssortingng' 

$subssortingng$subssortingng est une expression régulière.