Ik wil een script schrijven dat 15 strings doorloopt (mogelijk array?) Is dat mogelijk?
Zoiets als:
for databaseName in listOfNames
then
# Do something
end
Antwoord 1, autoriteit 100%
Je kunt het als volgt gebruiken:
## 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
Werkt ook voor array-declaratie met meerdere regels
declare -a arr=("element1"
"element2" "element3"
"element4"
)
Antwoord 2, autoriteit 32%
Dat kan natuurlijk.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Zie Bash Loops voor, terwijl en totvoor details .
Antwoord 3, autoriteit 9%
Geen van die antwoorden bevat een teller…
#!/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=0; i<${arraylength}; i++ ));
do
echo "index: $i, value: ${array[$i]}"
done
Uitvoer:
index: 0, value: one
index: 1, value: two
index: 2, value: three
Antwoord 4, autoriteit 8%
Ja
for Item in Item1 Item2 Item3 Item4 ;
do
echo $Item
done
Uitvoer:
Item1
Item2
Item3
Item4
Spaties behouden; enkele of dubbele lijst met aanhalingstekens en uitbreidingen van dubbele aanhalingstekens.
for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
do
echo "$Item"
done
Uitvoer:
Item 1
Item 2
Item 3
Item 4
Een lijst maken over meerdere regels
for Item in Item1 \
Item2 \
Item3 \
Item4
do
echo $Item
done
Uitvoer:
Item1
Item2
Item3
Item4
Eenvoudige lijstvariabele
List=( Item1 Item2 Item3 )
of
List=(
Item1
Item2
Item3
)
Toon de lijstvariabele:
echo ${List[*]}
Uitvoer:
Item1 Item2 Item3
Doorloop de lijst:
for Item in ${List[*]}
do
echo $Item
done
Uitvoer:
Item1
Item2
Item3
Maak een functie om door een lijst te gaan:
Loop(){
for item in ${*} ;
do
echo ${item}
done
}
Loop ${List[*]}
Het trefwoord declare (opdracht) gebruiken om de lijst te maken, die technisch gezien een array wordt genoemd:
declare -a List=(
"element 1"
"element 2"
"element 3"
)
for entry in "${List[@]}"
do
echo "$entry"
done
Uitvoer:
element 1
element 2
element 3
Een associatieve array maken. Een woordenboek:
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
Uitvoer:
Argentina is in America
Vietnam is in Asia
France is in Europe
CSV-variabelen of bestanden in een lijst.
Het interne veldscheidingsteken wijzigen van een spatie naar wat u maar wilt.
In het onderstaande voorbeeld is dit veranderd in een komma
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
Uitvoer:
Item 1
Item 2
Item 3
Indien nodig om ze te nummeren:
`
dit wordt een back-tick genoemd. Zet de opdracht tussen de achterste vinkjes.
`command`
Het staat naast het cijfer één op je toetsenbord en of boven de tab-toets, op een standaard Amerikaans-Engelstalig toetsenbord.
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
Uitvoer is:
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
Beter bekend raken met bashes-gedrag:
Maak een lijst in een bestand
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
Lees het lijstbestand in voor een lijst en toon
List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"
bash-opdrachtregeferentiaal: Speciale betekenis van bepaalde tekens of woorden aan de Shell.
Antwoord 5, Autoriteit 4%
In dezelfde geest als het antwoord van 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. Geen witruimte in de namen:
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
- In het tweede voorbeeld, met
listOfNames="RA RB R C RD"
heeft dezelfde uitvoer.
Andere manieren om gegevens in te nemen, zijn onder meer: ββ
- stdin (hieronder vermeld),
- variabelen ,
- een array (het geaccepteerde antwoord),
- een bestand …
Lees van 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
- The Bash ifs “veldscheider om te lijnen” [1 ] Afscheidingsteken kan in het script worden opgegeven om andere whitespace (dwz
IFS='\n'
of voor maco’sIFS='\r'
) - Ik vind het geaccepteerde antwoord ook leuk π – Ik heb deze fragmenten op als andere nuttige manieren die ook de vraag beantwoorden.
- inclusief
#!/bin/bash
Aan de bovenkant van het scriptbestand geeft de uitvoeringsomgeving aan. - Het kostte me maanden om erachter te komen hoe je dit eenvoudig moet coderen π
Andere bronnen
(tijdens het lezen van lus )
Antwoord 6, Autoriteit 2%
U kunt de syntaxis van ${arrayName[@]}
gebruiken
#!/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
Antwoord 7
Verbaasd dat niemand dit nog is gepost – als je de indices van de elementen nodig hebt terwijl je door de array loopt, kun je dit doen:
arr=(foo bar baz)
for i in ${!arr[@]}
do
echo $i "${arr[i]}"
done
Uitgang:
0 foo
1 bar
2 baz
Ik vind dit een stuk eleganter dan de “traditionele” voor -lus-stijl (for (( i=0; i<${#arr[@]}; i++ ))
).
(${!arr[@]}
en $i
hoeven niet te worden geciteerd omdat ze gewoon getallen zijn; sommigen zouden suggereren wat ze toch kunnen citeren, Maar dat is gewoon persoonlijke voorkeur.)
Antwoord 8
Dit is ook eenvoudig te lezen:
FilePath=(
"/tmp/path1/" #FilePath[0]
"/tmp/path2/" #FilePath[1]
)
#Loop
for Path in "${FilePath[@]}"
do
echo "$Path"
done
Antwoord 9
listOfNames="db_one db_two db_three"
for databaseName in $listOfNames
do
echo $databaseName
done
of gewoon
for databaseName in db_one db_two db_three
do
echo $databaseName
done
Antwoord 10
Impliciete array voor script of functies:
Naast het juiste antwoord van Anubhava : als de basissyntaxis voor lus is:
for var in "${arr[@]}" ;do ...$var... ;done