Arguments commande sh

bernard -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
j'ai un script shell que j'appelle essai.sh, donc si je l'appelle avec plusieurs arguments ça me fait:

./essai.sh arg1 arg2 arg3 arg4 arg5...

dans ce script je souhaite faire une boucle de l'argument 3 à l'argument n .

ON se rend compte que si j'écris : for i in "$@", ça ne marche pas car ça me compte tous les arguments.

Alors je pensais déclarer une variable que je nomme incrément et que j'initialise à 3: $incrément = 3.

et ensuite ma boucle ressemblerait à ceci:

for i in $incrément
...
...
incrément = `expr $incrément + 1`

Pensez vous que ça peut marcher avec ceci? Je vous demande ça car je souhaiterais savoir si ma méthode ne va pas boucler à l'infini svp?

merci
Configuration: Linux
Mozilla 1.9.0.15

6 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    [tmpfs]$ cat foo.sh
    #!/bin/bash
    
    #set -xv
    
    i=3
    
    while [ "$i" -le "5" ]
    do
    eval echo "\$$i"
    ((i++))
    done
    
    [tmpfs]$ ./foo.sh a b c d e f g h
    c
    d
    e
    
    [tmpfs]$

    ;-))
    0
    1. bernard
       
      salut jipicy, ta méthode est trop évoluée pour moi lol, je ne peux pas la retenir, en plus elle doit marcher pour n arguments et non 5, j'ai pris 5 au hasard. Penses tu que ma méthode soit valable?
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $  ./f a b c d e f g h
    c
    d
    e
    f
    g
    h
    $ ./f arg1 arg2 arg3 arg4 arg5
    arg3
    arg4
    arg5
    $ cat f
    #!/bin/bash
    
    for((arg=3; arg <= $#;arg++)) ; do echo ${!arg} ; done
    
    0
    1. bernard
       
      donc ma méthode est fausse?
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    non, mais il y manque le test de fin, $# représente le nombre d'arguments
    0
    1. bernard
       
      hum et comment écrire le test de fin s'il te plait dubcek?
      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    et aussi ${!arg} pour afficher le nième argument et non pas $arg
    0
    1. bernard
       
      en fait là je souhaite simplement savoir comment arrêter mon code, tu m'as parlé d'un test de fin mais je ne vois pas comment l'écrire dans ma boucle for...
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > bernard
         
        Il te l'a donné dans son exemple :

        $ cat f
        #!/bin/bash
        
        for((arg=3; arg <= $#;arg++)) ; do echo ${!arg} ; done

        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    pour sortir d'une boucle for tu peux faire
    if [ $i -ge $# ] ; then break ; fi
    0
    1. bernard
       
      ok je comprends mieux, bon et bien merci dubcek et jipicy pour votre aide.
      0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    on peut aussi faire:
    #!/bin/bash
    
    shift 2
    for ARG in $@ ; do echo $ARG ; done
    

    mais dans ce cas, $3 devient $1, donc les 2 premiers arguments ne sont plus accessibles
    0