3 votes

Comment puis-je lister toutes les variables de stdin dans boucle for ?

Avoir ce code :

#!/bin/bash
for i in $#; do echo ${$i}; done

wobei $# doit être le nombre de variables provenant de stdin, donne :

${$i}: bad substitution

Comment les énumérer sans avoir à les écrire echo $0; echo $1; echo ... Et comment substituer la variable elle-même à la variable ? (C'est à dire "construire" des noms de variables par exemple par une boucle)

4voto

James Mertz Points 390

Argv[] n'est pas stdin.

Les habituel est d'éviter complètement l'indexation et d'itérer sur le fichier valeurs directement (en gros, comment for..in est censé fonctionner en premier lieu). La variable spéciale "tableau" représentant tous les arguments est "$@" - Oui, les guillemets sont nécessaires pour que l'expansion du tableau se fasse correctement :

for v in "$@"; do
    echo "Got $v"
done

(Ne le faites pas avec $* ni avec les entreprises non cotées $@ car les deux vont perturber les args contenant des espaces).

Toutefois, si vous faire ont également besoin d'index, la syntaxe correcte de "déréférencement" en bash est la suivante ${!i} :

for (( i = 1; i <= $#; i++ )); do
    echo "Item $i is ${!i}"
done

(Notez la syntaxe de type C nécessaire pour itérer sur une plage numérique. Bien qu'il soit possible de faire estático gammes en utilisant for i in {1..10} qui malheureusement ne fonctionne pas lorsque des variables comme {1..$#} commencer à s'impliquer. Mais vous pouvez utiliser for i in $(seq 1 $#) si vous n'êtes pas gêné par le sous-processus supplémentaire).

Enfin, l'une des méthodes les plus anciennes consiste à répéter les opérations suivantes shift la liste des arguments :

while [ "${1+yes}" ]; do
    echo "Got $1"
    shift
done

Les ${var+string} est utilisée pour vérifier si la variable est fixé à n'importe quelle valeur au lieu de vérifier si les chaînes de caractères ne sont pas de longueur nulle. Vous pouvez parfois voir cette méthode simplifiée pour une vérification plus directe - ce qui est bien tant que vous êtes sûr à 100% qu'il n'y aura pas d'arguments de longueur nulle :

while [ "$1" ]; do
    echo "Got $1"
    shift
done

3voto

Arkadiusz Drabczyk Points 2334
#!/bin/bash

for i in "$@"; do echo "${i}"; done

Exemple :

$ ./s.sh a b c 'white space'
a
b
c
white space

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X