IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[BASH] Aide sur des commandes ou méthodes


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut [BASH] Aide sur des commandes ou méthodes
    Bonsoir,

    J'aimerai vérifier dans un script la validité de l'entier passé en paramètre, et cela sans passer par les expressions régulières, est-ce possible ?

    Comment écrire un script qui ajoute la date sous forme de commentaire en tête des fichiers passés en argument. voilà une suggestion :
    il faut aussi vérifier que tous les paramètres sont des fichiers !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!\bin\bash
    ver=1    //un vérificateur initialisé à 0 (si ver = 1 alors réussi, si ver=0 échoué)
    for file in $* do
         if ![ -f $file ]; then   //si ce n'est pas un fichier mettre ver=0 pour dire que c'est échoué 
               ver = 0       //affectation de 0 à ver
         fi
    done
    
    if [ ver -eq 1 ]; then
    for file in $* do
            //ici il faut ajouter la date sous forme de commentaire en tete des fichiers :(
    done

    Merci pour votre aide et d'avoir aussi prendre le temps de voir mon problème

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par seanbean Voir le message
    J'aimerai vérifier dans un script la validité de l'entier passé en paramètre, et cela sans passer par les expressions régulières, est-ce possible
    Si l'entier doit se trouver dans une plage de valeurs, il n'y a qu'à vérifier la plage en question avec des calculs : cela produira une erreur si ce n'est pas un entier.

    Attention, en shell les commentaires commencent par '#'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash  #!\bin\bash # On est sous windows ?
    for file in "$@"; do 
       # "$@" : Tous les arguments (qui peuvent contenir des espaces s'ils ont entre guillemets. 
       # Attention au ';' ou mettre le do à la ligne
       [ -f $file ] || exit 1
       # On peut très bien sortir directement, ce qui évite un sémaphore
    done
    for file in "$@"; do
       echo -e "# $(date)\n$(cat $file)" # > $file
       # ajouter la redirection pour écrire dans le fichier
    done

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Si l'entier doit se trouver dans une plage de valeurs, il n'y a qu'à vérifier la plage en question avec des calculs : cela produira une erreur si ce n'est pas un entier.

    Attention, en shell les commentaires commencent par '#'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash  #!\bin\bash # On est sous windows ?
    for file in "$@"; do 
       # "$@" : Tous les arguments (qui peuvent contenir des espaces s'ils ont entre guillemets. 
       # Attention au ';' ou mettre le do à la ligne
       [ -f $file ] || exit 1
       # On peut très bien sortir directement, ce qui évite un sémaphore
    done
    for file in "$@"; do
       echo -e "# $(date)\n$(cat $file)" # > $file
       # ajouter la redirection pour écrire dans le fichier
    done
    Merci fransoo !

    ça marche nickel ce code et merci beaucoup pour les commentaires c'est très bien expliqué !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Bonsoir,

    J'aimerai vérifier dans un script la validité de l'entier passé en paramètre, et cela sans passer par les expressions régulières, est-ce possible ?
    On fait un calcul et on détecte s'il y a erreur

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/bash
     
    # On commence par faire un calcul
    expr $1 + 0 1>/dev/null 2>&1; status=$?
     
    # On vérifie le code retour (attention, cas particulier de expr, il vaut 1 si le calcul donne 0 mais ça reste correct)
    if test $status -le 1
    then
        echo "$1 entier"
    else
        echo "$1 n'est pas un chiffre entier"
    fi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    On fait un calcul et on détecte s'il y a erreur

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    expr $1 + 0 1>/dev/null 2>&1; status=$?
    # On vérifie le code retour (attention, cas particulier de expr, il vaut 1 si le calcul donne 0 mais ça reste correct)
    if test $status -le 1
    then
        echo "$1 entier"
    else
        echo "$1 n'est pas un chiffre entier"
    fi
    On peut faire plus simple avec l'expansion arithmétique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <s>#!/bin/bash
    if (($1+=0)) &>/dev/null; then
       echo "$1 entier"
    else
       echo "$1 pas entier"
    fi
    # ou encore, en une ligne
    (($1+=0)) &>/dev/null && echo "$1 entier" || echo "$1 pas entier"</s>
    Mais attention :
    Ne retournera pas d'erreur car un string vide est interprété comme zéro ; même problème avec 'expr'.
    Retournera FAUX de même si A=0.
    Conclusion: Post que je pourrais effacer (de honte) mais il est plus utile comme ça

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Ne retournera pas d'erreur car un string vide est interprété comme zéro ; même problème avec 'expr'.
    Ah non. Certes, la syntaxe suivante
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=""
    expr $a + 0
    donne 0 preuve que expr a réussi son calcul... mais le code suivant
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=""
    expr "$a" + 0
    donne bien une erreur.

    La réussite précédente de expr n'était que parce que expr ne voyant pas d'opérande 1 a simplement conclu qu'il s'agissait du nombre "+0" à évaluer, ce qui donne 0.
    Dans le second cas, il détecte bien un opérande et là, détecte bien une opération impossible.

    On a le problème inverse avec le code suivant
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "Voulez-vous continuer ?"
    read rep
    if test $rep = "o" 
    then
        ...
    fi
    si on tape "return" à la question, la variable étant vide, le test sera bancal et renverra une erreur de type "unary operator expected" (il demande un opérateur unaire vu qu'il ne voit qu'un opérande)

    Alors que le code ci-dessous
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "Voulez-vous continuer ?"
    read rep
    if test "$rep" = "o" 
    then
        ...
    fi
    est parfaitement fonctionnel...

    D'où le fait de toujours encadrer une variable de guillemets pour éviter le pb "variable vide => shell ne voit rien" (toutefois j'aurais dû mettre aussi des guillemets dans mon script de détection numérique...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    ...
    D'où le fait de toujours encadrer une variable de guillemets pour éviter le pb "variable vide => shell ne voit rien" (toutefois j'aurais dû mettre aussi des guillemets dans mon script de détection numérique...)
    Tout à fait pertinent. Et je vais me reposer car l'évaluation arithmétique retourne FALSE (1) si le résultat est zéro !! Donc mon test n'est pas valable, mea culpa.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Tout à fait pertinent. Et je vais me reposer car l'évaluation arithmétique retourne FALSE (1) si le résultat est zéro !! Donc mon test n'est pas valable, mea culpa.
    Ben c'est vrai que j'ai tapé ton exemple sans succès.
    Toutefois n'étant pas habitué des spécificités bash par rapport à sh, je ne sais pas faire d'évaluation arithmétique et donc je me suis dit "tu tapes pas correctement" et j'ai pas insisté
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    sans utiliser de programme externe :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    shopt -s extglob
    var=1b2l3a
    if [[ $var == +([0-9]) ]] #ceci n'est pas une regexp (cf. man bash /Motifs génériques)
    then echo ok
    else echo KO
    fi
    Code portable : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var=1b2l3a
    if test "$var" -eq "$var" 2>/dev/null
    then echo ok
    else echo KO
    fi
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTML/CSS]Aide sur des div
    Par roudoudouduo dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 09/11/2006, 08h56
  2. Aide sur la commande rm
    Par ujoodha dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 21/08/2006, 21h40
  3. Aide sur les commandes sed et awk
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 20/06/2006, 08h22
  4. [Regex] besoin d'aide sur des motifs
    Par Oluha dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/11/2005, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo