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

Ubuntu Discussion :

comparaison numerique shell batch


Sujet :

Ubuntu

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 378
    Par défaut comparaison numerique shell batch
    je tourne en rond depuis plusieurs heures sur un truc idiot.
    je n'arrive pas à tester une valeur numerique.
    quelque soit la valeur de compare que je mets,
    le resultat est toujours le meme, "deux".

    voila l'exemple de batch que j'utilise pour tester.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/bash
     
    # recuperer le nombre de fichiers presents.
     nombre= find /home/sauvegarde/test | wc -l
    echo $nombres
    compare=60  # nombre à comparer que je modifie
    if [[ $nombre -gt $compare ]];
     then
    {
    echo "premier"
    }
    fi
     
    if [[ $nombre -lt $compare ]];
     then
    {
    echo "deux"
    }
    fi
    voila c'est tout con, mais j'apprends le shell et la je comprends pas ce qui se passe.
    j'ai cherché un exemple de test numerique < , >, = ;, mais dans tous les tutos, pas de traces, on dirait que personne ne teste jamais de valeur numerique...
    je me suis trompé, clair! mais comment il faut faire pour que ca fonctionne??

  2. #2
    Membre actif
    Avatar de debianhunter
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 63
    Par défaut
    Bonjour,
    Ne seraient-ce pas les ` (command substitution) qui manquent ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre=`find /home/sauvegarde/test | wc -l`

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    pas non plus besoin d'accolades, si on utilise if;
    de plus, on peut oublier wc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    compare=60
     
    # on crée un tableau contenant la liste des répertoires et des fichiers
    liste=( $(find /home/sauvegarde/test) )
    # on affecte le nombre d'items du tableau à une variable
    nombre=${#liste[@]}
    # on affiche le tableau ? ou pas !
    #printf '%s\n' "${nombres[@]}"
     
    (( nombre > compare )) &&  echo "premier" || {*(( nombre < compare )) && echo "deux"; }
    il y a un trou : si nombre = compare

  4. #4
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 378
    Par défaut
    pfou.. j'étais pas parti du bon sens..

    la suppression du wc, je comprends pas ,
    n'est il pas censé me donner le nombre de ligne de la liste trouvée sans avoir à stocker la liste des fichiers eux memes..?
    de plus, je comprends pas le # dans
    N_bah, si je comprends bien, t'as viré complétement le if, bizarre comme truc.. normalement, ca devrait juste evaluer l'expression,
    si il y pas de if devant, comment il peut executer l'instruction echo qui suit..??

    j'ai essayé le code de N_bah, mais une petite erreur de *
    ca donne ca corrigé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/bash
     
    compare=18
    echo $compare
    # fallait tester...
    base=`find /home/sauvegarde/test | wc -l`
    echo "nb fichiers  ${base}"
     
    # on crée un tableau contenant la liste des répertoires et des fichiers
    liste=( $(find /home/sauvegarde/test/test*) )
    # on affecte le nombre d'items du tableau à une variable
    nombre=${#liste[@]}
    # on affiche le tableau ? ou pas !
    printf 'tableau:  %s\n' "${nombre[@]}"
     
    #ca ca marche pas...???
    # (( nombre > compare )) &&  echo "premier" || {*(( nombre < compare )) && echo "deux"; }
    # ca ca marche :)
    (( nombre > compare )) &&  echo "premier" || {(( nombre < compare )) && echo "deux"; }
     
    # ca aussi..
    reponse3=`(( nombre > compare )) &&  echo "premier" || {(( nombre < compare )) && echo "deux"; }`
    echo $reponse3
    comme j'aime bien les structures if.. j'ai essayé..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo "nombre "$nombre"   compare "$compare
    if (($nombre <$compare)); then echo "inferieur"
    else
    echo "superieur egal"
    fi
    et ca fonctionne...
    merci N_bah

    je maitrise pas la signification particuliere des # $ ou @
    je suppose que dans le cas present, liste[@] c'est pour prendre tous les elements de la liste, mais le # de #liste[@] ?? il fait quoi.?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    le * est une typo.

    # permet d'afficher le nombre d'éléments d'une variable (le nombre de caractères).
    Pour les tableaux, cela affiche le nombre d'éléments d'un tableau (pas le nombre de caractères ! À moins de préciser l'élément du tableau dont tu veux le nombre de caractères)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var="a b c"
    echo ${#var}
    5
    tableau=( abcd ef ghi )
    echo ${#tableau[@]}
    3
    echo ${#tableau[0]}
    4
    echo ${#tableau[1]}
    2
    PS: mon pseudo est 'case sensitive', comme *n?x

Discussions similaires

  1. Script shell / batch
    Par whitelegend dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 07/05/2013, 14h16
  2. Comparaison de dates - Batch
    Par jbeaussier dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 27/11/2008, 12h31
  3. Script , Shell , Batch , Bash?
    Par A_B dans le forum Windows XP
    Réponses: 8
    Dernier message: 05/06/2007, 22h23
  4. Pascal et le shell Batch
    Par shadokk dans le forum Pascal
    Réponses: 3
    Dernier message: 06/09/2006, 11h57
  5. [Tableaux] comparaison numerique php
    Par kamel_leon dans le forum Langage
    Réponses: 8
    Dernier message: 08/03/2006, 15h35

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