[sh] afficher tous les arguments $1, $2, ... sans $@ : shift

Bonjour,

Je suis confronté à un petit problème : j’aimerai qu’à chaque tour d’une boucle while je puisse afficher le nième argument passé à la fonction courante.

J’y arrive mais c’est pas très compréhensible et donc c’est un nid à bugs :

[code]#!/bin/sh

echo_each() {
i=1
while [ $i -le $# ]; do
eval name=$$i
echo $name
i=expr $i + 1
done
}

echo_each “ab cd” “ef ghi” jkl ‘mno p q’[/code]

ou encore :

[code]#!/bin/sh

echo_each() {
i=1
while [ $i -le $# ]; do
name=eval echo '${'${i}'}'
echo $name
i=expr $i + 1
done
}

echo_each “ab cd” “ef ghi” jkl ‘mno p q’[/code]

On pourrait y arriver plus facilement, avec “for i in $@” mais j’ai besoin d’un contrôle plus fin que ça. Dans ce que je veux faire, j’ai besoin de cette boucle pour les arguments 2 à 5 puis 7 à 11, par exemple.

Quelqu’un connait une construction plus simple ?

Salut,

J’ai souvenir d’une instruction “shift” mais je me souviens plus en quel langage :blush:

#!/bin/sh while [ ! -z $1 ] ; do echo $1 shift done

edit: grillé

J’ai bien fait de demander ! C’est vraiment bien et c’est posix :smt007 merci beaucoup !

EDIT: Je me permet une petite correction :

[code]#!/bin/sh

echo_each() {
while [ $# -gt 0 ]; do
echo $1
shift
done
}

echo_each “ab cd” “” jkl ‘mno p q’[/code]

Comme ça on peut avoir des chaines vides parmis la liste d’arguments.