2218 votes

Effectuer une boucle sur le tableau de chaînes dans le script bash ?

J’ai envie d’écrire un script qui boucle sur 15 chaînes (tableau peut-être ?) est-ce possible ?

quelque chose comme :

Merci

3361voto

anubhava Points 172509

Vous pouvez l’utiliser comme ceci :

1093voto

4ndrew Points 3133

C’est possible, bien sûr.

Voir Bash boucles, tandis qu’et jusque pour plus de détails.

358voto

caktux Points 181

Aucune de ces réponses ne comprend un compteur ...

 #!/bin/bash
## declare an array variable
declare -a array=("one" "two" "three")

# get length of an array
arraylength=${#array[@]}

# use for loop read all values and indexes
for (( i=1; i<${arraylength}+1; i++ ));
do
  echo $i " / " ${arraylength} " : " ${array[$i-1]}
done
 

Sortie:

 1  /  3  :  one
2  /  3  :  two
3  /  3  :  three
 

117voto

user2533809 Points 633

Dans le même esprit que 4ndrew de réponse:

listOfNames="RA
RB
R C
RD"

# To allow for other whitespace in the string:
# 1. add double quotes around the list variable, or
# 2. see the IFS note (under 'Side Notes')

for databaseName in "$listOfNames"   #  <-- Note: Added "" quotes.
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R C
# RD

B. Pas d'espaces dans les noms de:

listOfNames="RA
RB
R C
RD"

for databaseName in $listOfNames  # Note: No quotes
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R
# C
# RD

Notes

  1. Dans le deuxième exemple, l'utilisation d' listOfNames="RA RB R C RD" a la même sortie.

D'autres moyens d'attirer les données comprennent:

Lire à partir de stdin.

# line delimited (each databaseName is stored on a line)
while read databaseName
do
  echo "$databaseName"  # i.e. do action / processing of $databaseName here...
done # <<< or_another_input_method_here

Côtés Notes

  1. le bash FI "champ separater à la ligne" [1] délimiteur peut être spécifié dans le script pour permettre à d'autres espaces (c - IFS='\n', ou pour MacOS IFS='\r')
  2. J'aime la accepté de répondre aussi :) -- j'ai inclure ces fragments de code que d'autres façons utiles aussi répondre à la question.
  3. Y compris #!/bin/bash dans le haut du fichier de script indique que l'environnement d'exécution.
  4. Il m'a fallu des mois pour comprendre comment le code de ces tout simplement :)

D'Autres Sources (tout lire en boucle)

56voto

Fizer Khan Points 4128

Vous pouvez utiliser la syntaxe de ${arrayName[@]}

 #!/bin/bash
# declare an array called array and define 3 vales
files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
for i in "${files[@]}"
do
    echo $i
done
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X