web-dev-qa-db-fra.com

boucle bash à travers la liste des chaînes

Est-il possible de formater cet exemple:

for i in string1 string2 stringN
do
 echo $i
done

à quelque chose de similaire à ceci:

for i in 
string1
string2
stringN
do
 echo $i
done

EDIT: Désolé pour la confusion, je ne savais pas qu'il y avait différentes méthodes d'exécution du script - sh <scriptname> contre bash <scriptname> et aussi cette chose que je ne peux pas nommer pour le moment - #!/bin/sh et #!/bin/bash :)

12
user296353

L'utilisation de tableaux dans bash peut améliorer la lisibilité: cette syntaxe de tableau permet des espaces arbitraires entre les mots.

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done
31
glenn jackman

Vous pouvez échapper au saut de ligne avec une barre oblique inverse:

$ for i in \
> hello \
> world
> do
> echo $i
> done
hello
world
$
4
Andy Dalton

Vous pouvez échapper aux sauts de ligne avant/après chaque élément que vous parcourez:

for i in \
    string1 \
    string2 \
    stringN
do
   printf '%s\n' "$i"
done

Ou, pour cet exemple simple:

printf '%s\n' string1 string2 stringN

qui a le même résultat.

En relation:

Variation utilisant un tableau bash:

strings=(
    string1
    string2
    stringN
)

printf '%s\n' "${strings[@]}"
2
Kusalananda

Si le passage à zsh est une option:

for string (
  string1
  'other string'
  etc..
) printf '%s\n' "$string"
1
Stéphane Chazelas

Même chose, moins de texte:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done
0
Cornelis van Ginkel

Vous pouvez utiliser la commande loop, disponible ici , comme ceci:

$ loop "echo $ITEM" --for string1,string2,string3

ou, si vous avez une liste sous forme de fichier:

$ cat file_list.txt | loop "echo $ITEM"
0
Rich Jones
list='a b c d'
for element in $list;do 
    echo "$element"
done
0
guest