0
votes

J'ai un script shell qui accepte deux paramètres de date et doit valider deux paramètres dans le format DD-MM-AAAA

J'ai un script shell qui accepte deux paramètres de date et doit valider deux paramètres dans le format DD-MM-AAAA. .... xxx

.........

Obtenir des dates non valides, mais si je le fais avec date "+% y-% m- % D "Puis il validait bien, s'il vous plaît laissez-moi savoir n'importe quel moyen de valider le format d'arguments de date comme DDMMyyyy.


5 commentaires

Dans votre fonction Reformate 1 $ et 2 $ à AAAAYY-MM-DD Avant d'appeler Date


Quel est le format d'arguments qui sont transmis comme 1 $ et 2 $ ?


Vous devez utiliser -ne pour tester l'inégalité numérique, ! = teste la chaîne inégalité. (NIT) Vous n'avez pas besoin de citer des variables à l'intérieur [[...] Vous devez avec [...] et test . Soyez cohérent dans votre utilisation de noms variable Gardant, par exemple. $ is_valid1 et $ {is_valid2} semble gênant cependant parfaitement bien.


@ Naidu5: Pourquoi fournissez-vous un format de date, qui est uniquement destiné à une mise en forme d'une date d'écriture à STDOUT, si vous déménageez ensuite le stdout. Sinon, votre approche n'est pas fausse; Il valide juste pour tout format quel que date accepte et devrait produire dates non valides si l'une des dates fournies n'est pas décodable par Date . Mais le message d'erreur que vous impression est trompeur. Il devrait être à la place: une de vos dates est invalide, mais je ne vous dirai pas qui . En outre, je ne jetterais pas Sterrr tout en déboguant le script, car cela pourrait fournir des informations supplémentaires ce qui ne va pas.


@ Naidu5: Regardez la page Data Man pour le paragraphe intitulé chaîne de date . Il décrit grossièrement, quel format est attendu pour spécifier la date.


3 Réponses :


0
votes

Arguments à Date -d code> ne peut pas être fourni dans le format DD-MM-AAAAAYY. Avant d'utiliser date -d code>, vous devez convertir vos paramètres de date en format que date -d code> peut gérer. Les travaux suivants, en convertissant les deux paramètres de date au format yyyymmdd: xxx pré>

exemple: p> xxx pré>

pour calculer la différence entre deux dates (En jours), vous pouvez utiliser: p>

./datediff_test.sh 30-07-2020 28-07-2020
2


4 commentaires

Merci pour l'aide maintenant, je passe ces paramètres pour calculer la différence de dates, mais obtenir des formats de date non valides tout en calculant à DATADIFFF () Funcion., Dates DIFF Fonction ci-dessous. ...... datrodiff () {## Calculer la différence de dates fdate = $ (date -d "$ date1" "+% s") sdate = $ (date -d "$ date2" "+% s" ) Période = $ ((((60 * 60 * 24)) datrodiff = $ (($ {fdate} - $ {sdate} - $ {sdate}) / ($ {sdate}) / ($ {sdate}))) echo $ datrodiff Aidez-vous à nouveau à calculer la date Différence du format DDMMyyyy uniquement.


Vous devez vous assurer que les paramètres de date sont convertis en format YYYYMMDD avant d'exécuter les commandes de la date . Je mettrai à jour ma réponse pour montrer comment calculer la différence entre deux dates.


Merci pour l'aide.


Pas de problème, s'il vous plaît upvote ma réponse si vous sentez que cela résout votre problème.



2
votes

Votre problème principal est que, tandis que date code> traitera une large gamme de formats avec -d code> il ne prendra pas de valeurs séparées par un trait d'union comme DD-MM-AAAAAA CODE> ou MM-DD-AAAAAYY CODE>. Dans un format délimité date code> attend mm / jays / aaaa code>. Donc, vous devrez reformater votre date dans ce format avant de tenter la conversion avec Date -d code>.

Vous devez également valider que vous avez le bon nombre d'entrées ainsi que d'utiliser local Code> Variables dans votre fonction. Ajout des validations et en utilisant awk code> pour un reformat rapide des arguments, vous pouvez faire: p> xxx pré>

( note: strong> Si vous n'utilisez pas BASH, vous devrez remplacer le em> em> avec un tuyau.) p>

Ajouter un script court pour vérifier l'entrée: p> xxx pré>

La fonction fonctionne comme vous l'avez l'intention, par exemple p> xxx pré>

ou dans le cas d'une date invalide: p >

$ ./chkdates.sh 21-4-1999 32-5-1999
date2 invalid
return 1


0 commentaires

0
votes

@tomptz, merci pour l'aide et le code ci-dessous fonctionne.

....
#! /bin/bash

convert_to_seconds() {
    day="$(cut -d'-' -f1 <<<$1)"
    month="$(cut -d'-' -f2 <<<$1)"
    year="$(cut -d'-' -f3 <<<$1)"
    echo "$(date "+%s" -d $year$month$day)"    
}

fdate="$(convert_to_seconds $1)"
sdate="$(convert_to_seconds $2)"
period=$((60*60*24)) 
datediff=$(((${fdate} - ${sdate})/${period})) 
echo $datediff
....


1 commentaires

Pas de problème, s'il vous plaît upvote ma réponse ci-dessous si vous le sentez que cela résout votre problème.