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

Shell et commandes GNU Discussion :

Tester le nombre de caractères d'une chaine


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut Tester le nombre de caractères d'une chaine
    Bonjour,

    J'aimerais créer un programme testant le nombre de caractères d'une string.
    Je voudrais que le programme prenne en entrée deux fichiers.
    Le premier contient une chaîne de caractères, le deuxième est utilisé pour contenir le résultat du test.

    J'ai écrit le code suivant qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    string_length = 'echo $1 | wc -c'
     
    if [[ string_length < 16 ]]
    then
       echo "Store .StringAt .planNameResult = 1;" > $2
    else
       echo "Store .StringAt .planNameResult = 0;" > $2
    Quelqu'un pourrait-il me dire ce qui ne va pas et me corriger ?
    Merci

    P.S. : je suis débutant !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 132
    Par défaut
    Prenons ligne par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string_length = 'echo $1 | wc -c'
    • Le caractère = utilisé pour l'affectation d'une valeur à une variable ne pas être précédé d'un espace, sous peine de ne pas être reconnu.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      string_length='echo $1 | wc -c'
    • Pour l'exécution en ligne d'une commande, il faut utiliser les guillemets inversés `...` et non les guillemets simples '...'. Par ailleurs, il est recommandé d'utiliser $(...) à la place de `...` dès lors qu'on utilise un shell plus évolué que sh.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      string_length=$(echo $1 | wc -c)
    • Si la chaine $1 débute ou finit par des espaces, elles ne seront pas comptées, puisque pas pris en compte. Il faut encadrer la variable de guillemets doubles pour contenir ces espaces.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      string_length=$(echo "$1" | wc -c)
    • Beaucoup plus simplement, bash (comme ksh) propose une moyen intégré de compter le nombre de caractères d'une variable : ${#nomvar}.
      Cet opérateur étant interne à l'interpréteur de commande, elle est beaucoup plus rapide qu'un appel à une commande externe telle que wc.


    Ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ string_length < 16 ]]
    • string_length est pris ici comme une chaine de caractères et nom comme une variable. Pour lire la valeur d'une variable , il faut au minimum faire précéder son nom du caractère $. Pour plus de lisibilité et pour éviter d'autres erreurs, on encadrera le nom de variable avec des accolades : ${nomvar}.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if [[ ${string_length} < 16 ]]
    • L'opérateur < est utilisé pour comparer des chaines de caractères, en fonction de l'ordre alphabétique. Ainsi '2' sera supérieur à '16', ce qui n'est pas tout à fait le résultat attendu. Pour comparer des valeurs numériques, on utilisera les opérateurs -gt, -ge, -eq, -ne, -lt ou -le (pour >, >=, =, !=, <= ou <).
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if [[ ${string_length} -lt 16 ]]


    Dernière ligne :


    Enfin, si la longueur de la chaine ne doit être utilisée que pour ce test, il est possible de simplifier le code en écrivant directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ ${#1} -lt 16 ]]...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Merci beaucoup, ça fonctionne nikel ! (il y avait beaucoup de fautes quand même)

    J'ai tout de même une autre question (je vais éviter de recréer un sujet et poster ici) :

    J'ai une chaîne de caractère dans un fichier, je voudrais ajouter le caractère ";" à la fin de la ligne, supprimer les espaces et renvoyer le résultat dans un autre fichier. J'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/sh
    cat $1 | sed 's/ //g' > $1.tmp
    cat $1.tmp sed 's/$//g' > $2
    Ca fonctionne pour la suppression des espaces mais je ne sais pas quoi rajouter pour mettre le caractère ";" en fin de ligne avant de supprimer les espaces.
    Merci

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 132
    Par défaut
    Tu veux supprimer tous les espaces ou seulement ceux en fin de ligne ?

    Suppression des espaces de fin de ligne et ajout de ; en fin de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/ *$/;/' "$1" > "$2"
    Suppression de tous les espaces et ajout de ; en fin de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/ //g;s/$/;/' "$1" > "$2"
    Et surtout, quand une commande peut recevoir un fichier en entrée (comme sed, grep, wc, ...), inutile de passer par cat.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    C'était la deuxième solution et c'est très bien

    J'ai parlé trop vite pour le premier programme car quelque soit la longueur de la string il rentre dans le else.
    J'ai écrit ce que tu m'a dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    if [[ ${#1} -lt 16 ]]
    then
       echo "1" > $2
    else
       echo "0" > $2
    fi
    Une idée sur le dysfonctionnement ?

    Edit : ajout du "#" manquant !

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,


  7. #7
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Ah oui désolé, c'est une faute de frappe mais le "#" est bien présent dans le programme qui renvoie 0 à chaque fois !!!

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Un exemple de comment tu lances ton script avec les paramètres ?

  9. #9
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    J'utilise un logiciel qui ne me permet pas de déterminer le nombre de caractère d'une string donc j'envoie les info dans le terminal de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo variable_Nom > fichier1
    programme.sh fichier1 fichier2
    Si variable_Nom = dfg j'ai 0 dans le fichier2 alors que je devrais avoir 1 en considérant le programme.sh comme précédemment.
    Si variable_Nom = dfguyklihloihmgrtujh j'ai 0 dans le fichier2 ce qui est correct.

    P.S. : la variable variable_Nom est déclarée dans le logiciel que j'utilise.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    $1 est le premier paramètre passé au script, càd : 'fichier1'
    soit moins de 16 caractères !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Ah ! Le problème c'est qu'il utilise le nom du fichier dans le test et non pas ce qu'il contient ?
    Comment je dois faire pour faire un test sur le contenu du fichier ?

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Re-

    Si le fichier ne contient qu'une ligne avec juste son contenu à récupérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ echo toto > f1
     
    $ cat f1 
    toto
     
    $ A=$(<f1)
     
    $ echo $A
    toto
     
    $ echo ${#A}
    4

  13. #13
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut
    Ca fonctionne !!!

    Merci à tous pour votre aide

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Thorfin Voir le message
    J'utilise un logiciel qui ne me permet pas de déterminer le nombre de caractère d'une string donc j'envoie les info dans le terminal de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo variable_Nom > fichier1
    programme.sh fichier1 fichier2
    Si variable_Nom = dfg j'ai 0 dans le fichier2 alors que je devrais avoir 1 en considérant le programme.sh comme précédemment.
    Si variable_Nom = dfguyklihloihmgrtujh j'ai 0 dans le fichier2 ce qui est correct.

    P.S. : la variable variable_Nom est déclarée dans le logiciel que j'utilise.
    Sinon, plutôt que de passer par un fichier intermédiaire fichier1, tu peux aussi fournir à ton programme, en premier argument, la valeur de ta variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo $variable_Nom   # Juste pour afficher la valeur
    programme.sh "$variable_Nom" fichier2
    et tester la longueur de $1 avec ${#1} comme tu avais fait précédemment.

    etc.
    )jack(

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

Discussions similaires

  1. nombre de caractères dans une chaine (Len)
    Par CryoCid dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/01/2010, 11h37
  2. [ksh]Nombre de caractères dans une chaine
    Par tizilfin dans le forum Linux
    Réponses: 3
    Dernier message: 14/10/2007, 12h51
  3. Tester le nombre de lettre d'une chaine de caractéres
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/05/2007, 15h58
  4. [SQL] Nombre de caractères d'une chaine de texte
    Par at_first dans le forum Access
    Réponses: 3
    Dernier message: 13/02/2007, 13h12
  5. Réponses: 10
    Dernier message: 31/12/2006, 12h35

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