Arguments commande sh

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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]$

    ;-))
    1. 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?
  2. Contributeur
    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
    
    1. donc ma méthode est fausse?
  3. Contributeur
    non, mais il y manque le test de fin, $# représente le nombre d'arguments
    1. hum et comment écrire le test de fin s'il te plait dubcek?
  4. Contributeur
    et aussi ${!arg} pour afficher le nième argument et non pas $arg
    1. 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...
    2. Modérateur
      @bernardIl te l'a donné dans son exemple :

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

  5. Contributeur
    pour sortir d'une boucle for tu peux faire
    if [ $i -ge $# ] ; then break ; fi
    1. ok je comprends mieux, bon et bien merci dubcek et jipicy pour votre aide.
  6. Contributeur
    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