En bash, je sais qu'il est possible d'écrire une for
boucle dans laquelle une variable de contrôle de boucle i
itère sur des entiers spécifiés. Par exemple, je peux écrire un script shell bash qui imprime les entiers entre 1 et 10:
#!/bin/bash
for i in {1..10}
do
echo $i
done
Est-il possible d'itérer à la place une variable de contrôle de boucle qui est une chaîne, si je fournis une liste de chaînes? Par exemple, supposons que j'ai une chaîne fname
qui représente un nom de fichier. Je veux appeler un ensemble de commandes pour chaque nom de fichier. Par exemple, je pourrais vouloir imprimer le contenu de l' fname
utilisation d'une commande comme celle-ci:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
En d'autres termes, à la première itération, fname
devrait avoir la valeur fname="a.txt"
, tandis qu'à la deuxième itération, fname
devrait avoir la valeur fname="b.txt"
, et ainsi de suite. Malheureusement, il semble que la syntaxe ci-dessus ne soit pas tout à fait correcte. Je voudrais obtenir la sortie:
a.txt
b.txt
c.txt
mais quand j'essaye le code ci-dessus, j'obtiens cette sortie:
{a.txt,
b.txt,
c.txt}
Pouvez-vous m'aider à déterminer la syntaxe correcte, afin que je puisse modifier de manière itérative la valeur / le contenu de la variable fname
? Merci pour votre temps.
la source
{}
, vous n'avez besoin de rien pour parcourir une liste (délimitée par des espaces){}
et le,
s. L'alternative est de supprimer les espaces. Alors soit"a.txt" "b.txt" "c.txt"
ou{"a.txt","b.txt","c.txt"}
. Mais je préfère{a..c}.txt
plutôt.Réponses:
La syntaxe correcte est la suivante:
la source
fnames=( a.txt b.txt c.txt )
vous pouvez utiliser la syntaxefor f in ${fnames[@]}; do echo $f; done
.for fname in a.txt b.txt c.txt
etfor fname in "a.txt" "b.txt" "c.txt"
donner des résultats identiques?for f in "${fnames[@]}"; do echo $f; done
(avec des guillemets autour${fnames[@]}
) si lesfnames
valeurs peuvent contenir des espaces. Et vous devriez utiliser"$f"
, surtout si vous faites quelque chose de plus sophistiqué queecho
(par exemple,cat
oucp
). (Et même si vous ne faites que celaecho
, vous devriez utiliser à laprintf
place.)Il me semble que tu devrais juste faire ...
la source
Comme indiqué par user13742 dans les commentaires , nous pouvons utiliser des tableaux dans
bash
etksh
:Et fonctionne ainsi:
Cependant, certains shells tels que
dash
(/bin/sh
sur Ubuntu) ne prennent pas en charge les tableaux. Dans ce cas, nous pourrions recourir à la structure du document ici:<<
la source