Comment puis-je vérifier si $ date1 est avant $ date2 en shell?

date1=$1 date2=$2 

Comment puis-je vérifier si $date1 est avant $date2 ?

Les deux dates sont en format DD/MM/YY , soit 01/01/15 .

Divisez-le d'abord en champs, car vous devrez les réorganiser. AAMMJJ ou AAAAMMJJ est beaucoup mieux pour ce type d'opération de comparaison car il peut regarder l'set de la string à la fois.

 IFS="/" date1a=($date1) date2a=($date2) 

Ensuite, si vous avez besoin d'années avant 1999, fixez les années à deux numbers à quatre numbers, sinon 99 est supérieur à 01.

 ((date1a[2] += (date1a[2] < 70 ? 2000 : 1900))) ((date2a[2] += (date2a[2] < 70 ? 2000 : 1900))) 

Puis remettez-les set dans l'ordre AAAAMMJJ:

 date1b="${date1a[2]}${date1a[1]}${date1a[0]}" date2b="${date2a[2]}${date2a[1]}${date2a[0]}" 

Et maintenant vous pouvez les comparer:

 if (( $date1b < $date2b )); then echo "earlier" else echo "later" fi 

Remarque: Il s'agit d'une réponse spécifique à bash, en fonction des fonctionnalités spécifiques à bash (et ksh) non spécifiées dans POSIX, et donc ne fonctionne pas avec /bin/sh ou le shell par défaut sur certains systèmes.


POSIX nécessite une approche différente; vous pouvez countr sur awk pour faire le gros du travail:

 awkscr='BEGIN {FS="/"}; {print $3+($3<70?2000:1900) $2 $1}' date1b=$(echo "$date1" | awk "$awkscr") date2b=$(echo "$date2" | awk "$awkscr") if [ "$date1b" -lt "$date2b" ]; then echo "earlier" else echo "later" fi 

si vous voulez être vraiment effronté, vous pouvez toujours convertir les dates basées sur l'époque 1970-01-01 00:00:00 UTC.

 #added to fix DD/MM/YY format input1=`echo $1 | awk -F "/" '{print $2"/"$1"/"$3}'` input2=`echo $2 | awk -F "/" '{print $2"/"$1"/"$3}'` date1=`date +%s --date="$input1"` date2=`date +%s --date="$input2"` if [[ "$date1" -lt "$date2" ]]; then echo "$1 earlier than $2" else echo "$1 not earlier than $2" fi