Boucle à travers un réseau de cordes à Bash?

je veux écrire un script qui parcourt 15 cordes (array éventuellement?) Est-ce possible?

quelque chose comme:

for databaseName in listOfNames
then
  # Do something
end
1019
demandé sur Peter Mortensen 2012-01-16 17:21:16

19 réponses

Vous pouvez l'utiliser comme ceci:

## declare an array variable
declare -a arr=("element1" "element2" "element3")

## now loop through the above array
for i in "${arr[@]}"
do
   echo "$i"
   # or do whatever with individual element of the array
done

# You can access them using echo "${arr[0]}", "${arr[1]}" also

fonctionne aussi pour la déclaration de tableau multiligne

declare -a arr=("element1" 
                "element2" "element3"
                "element4"
                )
1636
répondu anubhava 2016-11-14 07:53:22

C'est possible, bien sûr.

for databaseName in a b c d e f; do
  # do something like: echo $databaseName
done 

Voir Bash Boucles for, while et jusqu'à ce que pour plus de détails.

551
répondu 4ndrew 2016-12-13 17:27:05

aucune de ces réponses ne comprend de compteur...

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

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

# use for loop to 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
142
répondu caktux 2015-07-09 05:24:39

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

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 de blanc dans les noms:

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, en utilisant listOfNames="RA RB R C RD" a la même sortie.

les autres moyens d'obtenir des données comprennent:

lire 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
  1. The bash IFS "séparateur de champ À ligne" [ 1 ] le délimiteur peut être spécifié dans le script pour permettre d'autres espaces (i.e. IFS='\n' , ou pour MacOS IFS='\r' )
  2. j'aime la réponse acceptée aussi :) -- j'ai inclus ces extraits comme d'autres moyens utiles qui répondent également à la question.
  3. incluant #!/bin/bash en haut du fichier script indique l'environnement d'exécution.
  4. il m'a fallu des mois pour comprendre comment coder ceci simplement:)

Autres Sources ( alors que la lecture en boucle )

95
répondu user2533809 2017-05-23 12:10:54

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

#!/bin/bash
# declare an array called files, that contains 3 values
files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
for i in "${files[@]}"
do
    echo "$i"
done
33
répondu Fizer Khan 2017-10-25 05:36:23

Oui

for Item in Item1 Item2 Item3 Item4 ;
  do
    echo $Item
  done

sortie:

Item1
Item2
Item3
Item4

sur plusieurs lignes

for Item in Item1 \
            Item2 \
            Item3 \
            Item4
  do
    echo $Item
  done

sortie:

Item1
Item2
Item3
Item4



variable de liste Simple

List=( Item1 Item2 Item3 )

ou

List=(
      Item1 
      Item2 
      Item3
     )

afficher la variable de liste:

echo ${List[*]}

sortie:

Item1 Item2 Item3

boucle de la liste:

for Item in ${List[*]} 
  do
    echo $Item 
  done

sortie:

Item1
Item2
Item3

créer une fonction pour passer par une liste:

Loop(){
  for item in ${*} ; 
    do 
      echo ${item} 
    done
}
Loop ${List[*]}

expansion de la liste de citation:

List=(' Item 1 '
      ' Item 2' 
      ' Item 3'
     )
for item in "${List[@]}"; 
  do 
    echo "$item"
  done 

sortie:

 Item 1
 Item 2
 Item 3

en utilisant le mot-clé declare (commande) pour créer la liste, qui est techniquement appelé un tableau:

declare -a List=(
                 "element 1" 
                 "element 2" 
                 "element 3"
                )
for entry in "${List[@]}"
   do
     echo "$entry"
   done

sortie:

element 1
element 2
element 3

Création d'un tableau associatif . Un dictionnaire:

declare -A continent

continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America

for item in "${!continent[@]}"; 
  do
    printf "$item is in ${continent[$item]} \n"
  done

sortie :

 Argentina is in America
 Vietnam is in Asia
 France is in Europe

CVS des variables ou des fichiers dans une liste de .

changer le séparateur de champ interne d'un espace , à ce que vous voulez .

dans l'exemple ci-dessous, il est remplacé par une virgule

List="Item 1,Item 2,Item 3"
Backup_of_internal_field_separator=$IFS
IFS=,
for item in $List; 
  do
    echo $item
  done
IFS=$Backup_of_internal_field_separator

sortie:

Item 1
Item 2
Item 3

S'il faut les numéroter:

` 

c'est appelle un retour de la tique . Mettez la commande dans Back ticks .

`commend` 

Il est à côté du numéro un sur votre clavier et ou au-dessus de la touche de tabulation . Sur un clavier Anglais Américain standard .

List=()
Start_count=0
Step_count=0.1
Stop_count=1
for Item in `seq $Start_count $Step_count $Stop_count`
    do 
       List+=(Item_$Item)
    done
for Item in ${List[*]}
    do 
        echo $Item
    done

est :

Item_0.0
Item_0.1
Item_0.2
Item_0.3
Item_0.4
Item_0.5
Item_0.6
Item_0.7
Item_0.8
Item_0.9
Item_1.0

se familiariser avec le comportement des bashes:

Créer une liste dans un fichier

cat <<EOF> List_entries.txt
Item1
Item 2 
'Item 3'
"Item 4"
Item 7 : *
"Item 6 : * "
"Item 6 : *"
Item 8 : $PWD
'Item 8 : $PWD'
"Item 9 : $PWD"
EOF

Lire la liste de fichier dans une liste et l'affichage

List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"

BASH en ligne de commande manuel de référence : signification Particulière de certains caractères ou des mots à la coque.

27
répondu FireInTheSky 2018-07-04 11:35:39

C'est aussi facile à lire:

FilePath=(
    "/tmp/path1/"    #FilePath[0]
    "/tmp/path2/"    #FilePath[1]
)

#Loop
for Path in "${FilePath[@]}"
do
    echo "$Path"
done
17
répondu Treethawat Thanawachiramate 2015-07-03 04:03:53

le declare array ne fonctionne pas pour Korn shell. Utilisez l'exemple ci-dessous pour le shell Korn:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

for i in ${promote_arry[*]};
    do
            echo $i
    done
4
répondu Bhanu 2017-06-04 21:51:51

tableau implicite pour script ou fonctions:

en plus de anubhava 'S réponse correcte: si la syntaxe de base pour la boucle est:

for var in "${arr[@]}" ;do ...$var... ;done

il y a un spécial cas :

lors de l'exécution d'un script ou d'une fonction, arguments passés aux lignes de commande seront assignés à la variable de tableau $@ , vous peut accès par , , , et ainsi de suite.

peut être rempli (pour test) par

set -- arg1 arg2 arg3 ...

Un boucle plus ce tableau pourrait être écrit simplement:

for item ;do
    echo "This is item: $item."
  done

Note que le travail réservé in n'est pas présent et aucun nom de tableau aussi!

Exemple:

set -- arg1 arg2 arg3 ...
for item ;do
    echo "This is item: $item."
  done
This is item: arg1.
This is item: arg2.
This is item: arg3.
This is item: ....

notez que c'est la même chose que

for item in "$@";do
    echo "This is item: $item."
  done

puis dans un script :

#!/bin/bash

for item ;do
    printf "Doing something with '%s'.\n" "$item"
  done

Sauver dans un script myscript.sh , chmod +x myscript.sh , puis

./myscript.sh arg1 arg2 arg3 ...
Doing something with 'arg1'.
Doing something with 'arg2'.
Doing something with 'arg3'.
Doing something with '...'.

Même dans un fonction :

myfunc() { for item;do cat <<<"Working about '$item'."; done ; }

puis

myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.
4
répondu F. Hauri 2017-12-05 08:01:30
listOfNames="db_one db_two db_three"
for databaseName in $listOfNames
do
  echo $databaseName
done

ou juste

for databaseName in db_one db_two db_three
do
  echo $databaseName
done
3
répondu nroose 2016-08-25 00:20:03

Si vous utilisez le shell Korn, il y a " - databaseName ", sinon il y a " déclare -databaseName "

pour écrire un script travaillant sur tous les shells,

 set -A databaseName=("db1" "db2" ....) ||
        declare -a databaseName=("db1" "db2" ....)
# now loop 
for dbname in "${arr[@]}"
do
   echo "$dbname"  # or whatever

done

il devrait être de travail sur tous les coquillages.

2
répondu The smart Eagle 2014-09-25 08:32:53

c'est similaire à la réponse de user2533809, mais chaque fichier sera exécuté comme une commande séparée.

#!/bin/bash
names="RA
RB
R C
RD"

while read -r line; do
    echo line: "$line"
done <<< "$names"
1
répondu Jamie 2016-10-16 21:59:34

première ligne Possible de chaque script Bash / session:

say() { for line in "${@}" ; do printf "%s\n" "${line}" ; done ; }

utiliser par exemple:

$ aa=( 7 -4 -e ) ; say "${aa[@]}"
7
-4
-e

peut considérer: echo interprète -e comme option ici

1
répondu elf12 2017-06-04 22:02:27

une Seule ligne de boucles 151930920"

 declare -a listOfNames=('db_a' 'db_b' 'db_c')
 for databaseName in ${listOfNames[@]}; do echo $databaseName; done;

, vous obtiendrez une sortie comme celle-ci,

db_a
db_b
db_c
1
répondu Mohideen ibn Mohammed 2017-06-27 13:16:43

surpris que personne n'ait encore posté ceci -- si vous avez besoin des indices des éléments pendant que vous faites une boucle à travers le tableau, vous pouvez le faire:

arr=(foo bar baz)

for i in ${!arr[@]}
do
    echo $i "${arr[i]}"
done

sortie:

0 foo
1 bar
2 baz

je trouve cela beaucoup plus élégant que le style" traditionnel "en boucle ( for (( i=0; i<${#arr[@]}; i++ )) ).

( ${!arr[@]} et $i ) n'ont pas besoin d'être cités parce qu'ils ne sont que des nombres; certains suggéreraient de les citer de toute façon, mais c'est juste préférence personnelle.)

1
répondu Doorknob 2018-08-10 22:27:16

essayez ceci. Il fonctionne et est testé.

for k in "${array[@]}"
do
    echo $k
done

# For accessing with the echo command: echo ${array[0]}, ${array[1]}
0
répondu Simpal Kumar 2017-06-04 22:01:28

voie Simple:

arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array

len=${#arr[*]}  # it returns the array length

#iterate with while loop
i=0
while [ $i -lt $len ]
do
    echo ${arr[$i]}
    i=$((i+1))
done


#iterate with for loop
for i in $arr
do
  echo $i
done

#iterate with splice
 echo ${arr[@]:0:3}
0
répondu rashedcs 2018-09-02 15:36:01

C'est la solution la plus simple, en supposant qu'il n'y ait pas d'espaces dans les noms:

listofNames = "A B C D"

for databaseName in $listOfNames; do
    echo $databaseName
done
-1
répondu Mark Matthews 2018-09-12 08:33:50

je boucle à travers un tableau de mes projets pour une git pull mise à jour:

#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
    cd  $HOME/develop/$project && git pull
end
-3
répondu jiahut 2017-06-04 22:02:58