Shell (parser ligne de commande)

Résolu
Bonjour, tout le monde
Je viens de decouvrir le langage shell sh et je n'arrive pas a me renseigner sur le moyen de parser la ligne de commande. Par exemple

./fichier_shell.sh bonjour tout le monde

donc le fichier_shell aura:
$1=bonjour
$2=tout
$3=le
$4=monde

contrairement au php par exemple on pouvait faire
for($i = 0; $i < $argc; $i++){
echo $argv[$i];
}

Mais je suis incapable de faire une boucle sur les arguements $1,$2... pour voir ce que chacune variable a comme valeur

Merci beaucoup de votre aide
Configuration: FreeBSD
Firefox 2.0.0.6

8 réponses

  1. Contributeur
    Salut,

    $ cat tableau.sh
    #! /bin/bash
    
    i=0
    
    for param in "${@}";do
      TABLEAU[$i]="${param}"
      ((i++))
    done
    
    #affiche le nombre d'élément
    nbItem=${#TABLEAU[*]}
    echo "$nbItem"
    
    for ((i=0;i<$nbItem;i++)); do
      echo ${TABLEAU[${i}]}
    done
    
    $ ./tableau.sh un deux "3 et trois" quatre
    4
    un
    deux
    3 et trois
    quatre
    
    $

    ;-))
    1. Salut!

      J'ai utilise l'astuce des tableau indique ici pour recuperer ma ligne de commande et la parser, mais il se trouve qu'avec les tableau aucun chaine de caractere be doit contenir un espace.

      Exemple, si l'argument de la ligne de commande est 'val 03' ou "val 03", le tableau va le placer dans deux elements, le premier etant "val" et le second "03", pourtant l'argment en question est bien "val 03" dans tous les cas. Et un echo de 'val 03' affiche bien val 03.
      Merci de bien vouloir proposer un moyen de gerer ce cas de figure.
      1. Modérateur
        Salut,

        Juste pour dire que si il y a plus de 9 paramètres, les suivants doivent être appelés comme suit : s{10}, s{11},..., ${15], etc...

        Voir dans la FAQ : Les paramètres

        Sinon, tu peux aussi utiliser les "tableaux" (attention la numérotation dans ce cas commence à "0" (zéro) ) :
        $ cat bar.sh
        #! /bin/bash
        
        TABLEAU=( $(echo $*) )
        i=0
        while [ "$i" -lt "${#TABLEAU[@]}" ]
        do echo ${TABLEAU[$i]}
        i=$((i+1))
        done
        
        $ ./bar.sh premier second troisième quatrième
        premier
        second
        troisième
        quatrième
        ;-))
        1. Modérateur
          Pour static tu utilise directement $1,$2,....

          Pour faire une boucle sur le nombre d'arguments tu peux faire aussi
          #!/bin/bash
          
          i=1
          while [ $i -le $# ];do
              eval "echo \$$i"
              i=$((i+1))
          done
          Bref, si tu veux apprendre le fonctionnement, sache qu'il y a toujours plusieurs façon de le faire
          ensuite en fonction de ce que tu veux faire il faut adapter ;-)
          1. Ok je vois plus clair

            J'ai redite mon message pendant que tu me repondait :

            Si on boucle sur $1 comment ferais je si je veux un $1 $2 ou $3... statique dans la boucle?

            Encore merci rapides :)
            1. Modérateur
              -n c'est un test sur une chaine = la longueur de la chaine est non nulle
              Donc la boucle s'exécute tant qu'il y a une chaine de longueur non nulle

              pour shift regarde man bash

              shift [n]
              Les paramètres positionnels à partir de n+1 ... sont renommés en $1 .... Les paramètres représentés par les nombres $#
              jusqu'à $#-n+1 sont détruits. n doit être un entier positif inférieur ou égal à $#. Si n vaut 0, aucun paramètres n'est mod-
              ifié. Si n est omis, on suppose qu'il vaut 1. Si n est supérieur à $#, les paramètres positionnels ne sont pas modifiés.
              L'état renvoyé est strictement plus grand que zéro si n est plus grand que $# ou plus petit que zéro ; sinon 0.

              1. oula rapide la reponse ^^ merci

                Mais tu pourrai mexpliquer un peu sur la fonction du "-n" dans la boucle While et le mot shift dans l'instruction de ce dernier?
                Et par ailleurs si on boucle sur $1 comment ferais je si je veux un $1 $2 ou $3... statique dans la boucle?
                1. Modérateur
                  Salut,

                  par exemple
                  lami20j@debserv:~/trash$ cat ccm.sh
                  #!/bin/bash
                  
                  while [ -n "$1" ] ; do
                      echo $1
                      shift
                  done
                  lami20j@debserv:~/trash$ sh ccm.sh bonjour tout le monde
                  bonjour
                  tout
                  le
                  monde
                  lami20j@debserv:~/trash$