Forum Linux.redhat Problème de script SHELL

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
1
juin
2018

Bonjour,

Je rencontre un problème de création de script:
Je veux analyser le contenu de chaque caractère d'une chaine, mais le résultat de l'exécution du script est incompréhensible.
La chaine usern est la suivante: "4 5" (3 caractères avec un espace entre le 4 et le 5).
Je voudrais stocker chaque caractère dans une nouvelle variable pour chaque caractère autre qu'un espace.

Or lorsque j'analyse le contenu de la chaine, j'ai le résultat suivant:
[root@VLNXDIAP2 nagios_sh]# ./diap_users.sh

4

./diap_users.sh: line 23: [[4 : commande introuvable

CHIFFRE



./diap_users.sh: line 23: [[ : commande introuvable

CHIFFRE

5

./diap_users.sh: line 23: [[5 : commande introuvable

CHIFFRE
#! /bin/bash

#Script qui renvoi le nombre d'utilisateurs connectés



retour=' '

flag_retour=0

critique=0



#create_fichier=$(/Outils/bin/statutdiap.sh > /Outils/nagios_sh/tmp/statutdiapusers)

fichier="/Outils/nagios_sh/tmp/statutdiapusers"

sed -n '2p' $fichier >  /Outils/nagios_sh/tmp/linextracted

fichier2="/Outils/nagios_sh/tmp/linextracted"



#Lecture de la ligne du fichier

while read line

   do

       users="${line:${#line} - 4} "

done < $fichier2



usersn=${users:0:3}



#Analyse chaque cacartere de la chaine usern



while read -n1 character; do

    echo "$character"

 if [["$character" -eq " "]]

 then

   echo "ESPACE"

 else

   echo "CHIFFRE"

 fi

done < <(echo -n "$usersn")

exit
  • # Remplace les doubles crochets par des simples dans ton test , et mettre un espace ...

    Posté par  . Évalué à 4.

    .. entre ton crochet et le premier terme de ton test.

    if [["$character" -eq " "]]

    devient

    if [ "$character" -eq " " ]

    En effet '[' est une commande (soit sur le système de fichier, soit une commande interne du shell).

    Pour t'en convaincre : :

    $ ls /usr/bin/[
    /usr/bin/[*

    • [^] # Re: Remplace les doubles crochets par des simples dans ton test , et mettre un espace ...

      Posté par  . Évalué à 2.

      A noter que le test avec est disponible sous ksh, mais je n'ai pas l'impression qu'il le soit sous bash, a moins d'activer une option quelconque que je ne connais pas.

    • [^] # Re: Remplace les doubles crochets par des simples dans ton test , et mettre un espace ...

      Posté par  . Évalué à 3.

      Certes, mais il utilise explicitement bash, il n'y a donc pas de raison de s'interdire l'utilisation de [[, qui a l'avantage d'être une construction du langage (voir la documentation de bash), ce qui évite notamment de lancer une commande à chaque fois.
      Le seul problème était effectivement l'oubli de l'espace après [[

      • [^] # Re: Remplace les doubles crochets par des simples dans ton test , et mettre un espace ...

        Posté par  . Évalué à 2.

        Certes, mais il utilise explicitement bash, il n'y a donc pas de raison de s'interdire l'utilisation de [[, qui a l'avantage d'être une construction du langage (voir la documentation de bash), ce qui évite notamment de lancer une commande à chaque fois.

        Disons que pour une raison que j'ignore, lorsque j'ai testé le [[ avec bash, ça n'a pas marché, et j'en ai déduit que bash ne prenait pas cette construction. J'ai été conforté dans mon erreur par le messae du posteur initial qui disait :

        ./diap_users.sh: line 23: [[ : commande introuvable

        Je n'avais pas percuté que le shell voulait utiliser la commande '[[ ' (double crochet avec espace derrière), j'en ai donc conclu à tort que les doubles crochets n'étaient pas reconnus par bash.

        Cependant après avoir retesté, j'ai vu que ça fonctionnait, donc ma remarque sur le fait que bash ne reconnaisse pas le double crochet est donc erronée.

        Maintenant, sur le fait d'utiliser des spécificités d'un shell donné, je suis assez partagé : personnellement, dans le cas de la syntaxe des tests, je préfère largement (et recommande grandement) d'utiliser la syntaxe qui sera reconnue par le plus grand nombre de shell possible: ça évite de se prendre la tête quand on passe d'un environnement à un autre. Par contre, je suis moins catégorique sur les spécificités avancées d'un shell par rapport à un autre, car celles-ci peuvent rendre bien des services, et là c'est du cas par cas : si la façon de faire la plus générale ne complique pas trop les choses, j'opterai pour cette façon de faire, mais si le shell que j'utilise permet de simplifier grandement la résolution d'un problème donné par une de ses spécificités (ou qu'une spécificité rende le code beaucoup plus lisible), j'adopterai sans hésiter cette façon de faire.

  • # whaou

    Posté par  . Évalué à 7.

    1er problème :

    Tester des script en tant que root. JAMAIS!!!

    2eme problème :

    il faut rajouter un espace entre tes [[ et le "$character" sinon tu cherches à appeler la commande "[[4" qui n'existe pas.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: whaou

      Posté par  . Évalué à 1.

      Quelle est la commande qui me permet de tester la présence d'un espace dans une chaîne ?

      J'ai essayé avec grep ' ' ou alors grep "+:space ou alors if [[ "$string" =~ \ | ]] mais le résultat du test est faut lorsque je l'implémente dans la boucle.

      while read -n1 character; do
      echo "$character"
      if echo $character | grep "+:space+" >/dev/null
      then
      echo "ESPACE"
      else
      echo "CHIFFRE"
      fi
      done < <(echo -n "$usersn")

      • [^] # Re: whaou

        Posté par  . Évalué à 2.

        le soucis c'est que lorsque tu chope un espace la variable ne récupère rien ;)

        tu peux donc tester

        while read -n1 character; do
        echo "[$character]"
        if [ -z "$character" ]
        then
         echo "Espace"
        else
         echo autre
        fi
        done

        j'ai toujours tendance à 'encadrer' mes variable dans mes trace de debug dans ce cas précis tu aurais de suite vu le soucis

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: whaou

          Posté par  . Évalué à 1.

          Merci pour ton aide, en effet ton astuce de mettre la variable entre parenthèse m'aurait fait tilter.

          Merci encore pour ton aide.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.