it-swarm.com.de

Eine Reihe von Zeichenfolgen in Bash durchlaufen?

Ich möchte ein Skript schreiben, das 15 Zeichenfolgen durchläuft (Array möglicherweise?). Ist das möglich?

So etwas wie:

for databaseName in listOfNames
then
  # Do something
end
1305
Mo.

Du kannst es so benutzen:

## 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

Funktioniert auch für die mehrzeilige Array-Deklaration

declare -a arr=("element1" 
                "element2" "element3"
                "element4"
                )
2095
anubhava

Das ist natürlich möglich.

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

Siehe Bash Loops für, während und bis für Details.

690
4ndrew

Keine dieser Antworten enthält einen Zähler ...

#!/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

Ausgabe:

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

Im gleichen Sinne wie 4ndrews Antwort:

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. Kein Leerzeichen in den 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

Notizen

  1. Im zweiten Beispiel hat die Verwendung von listOfNames="RA RB R C RD" dieselbe Ausgabe.

Andere Möglichkeiten zum Einspielen von Daten sind:

Aus stdin lesen

# 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. das Trennzeichen Bash IFS "Feldtrennzeichen bis Zeile" [ 1 ] kann im Skript angegeben werden, um andere Leerzeichen (z. B. IFS='\n' oder für MacOS) zuzulassen IFS='\r')
  2. Ich mag die akzeptierte Antwort auch :) - Ich habe diese Ausschnitte als andere hilfreiche Möglichkeiten aufgenommen, die auch die Frage beantworten.
  3. Das Einschließen von #!/bin/bash am Anfang der Skriptdatei gibt die Ausführungsumgebung an.
  4. Ich habe Monate gebraucht, um herauszufinden, wie man das einfach codiert :)

Andere Quellen ( während Leseschleife )

103
user2533809

Ja

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

Ausgabe:

Item1
Item2
Item3
Item4

Über mehrere Zeilen

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

Ausgabe:

Item1
Item2
Item3
Item4


Einfache Listenvariable

List=( Item1 Item2 Item3 )

oder

List=(
      Item1 
      Item2 
      Item3
     )

Zeigen Sie die Listenvariable an:

echo ${List[*]}

Ausgabe:

Item1 Item2 Item3

Durchlaufen Sie die Liste:

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

Ausgabe:

Item1
Item2
Item3

Erstellen Sie eine Funktion, um eine Liste durchzugehen:

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

Um Räume zu erhalten; einfache oder doppelte Anführungszeichenlisteneinträge und doppelte Anführungszeichenlistenerweiterungen:

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

Ausgabe:

 Item 1
 Item 2
 Item 3

Verwenden Sie das Schlüsselwort declare (Befehl), um die Liste zu erstellen, die technisch als Array bezeichnet wird:

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

Ausgabe:

element 1
element 2
element 3

Assoziatives Array erstellen. Ein Wörterbuch:

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

Ausgabe:

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

CVS-Variablen oder Dateien in einer Liste .
Ändern Sie das interne Feldtrennzeichen von einem Leerzeichen nach Belieben.
Im folgenden Beispiel wird es in ein Komma geändert

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

Ausgabe:

Item 1
Item 2
Item 3

Wenn Sie diese nummerieren müssen:

` 

dies nennt man einen Back Tick. Setzen Sie den Befehl in Back Ticks.

`commend` 

Es befindet sich neben der Nummer eins auf Ihrer Tastatur und oder über der Tabulatortaste. Auf einer Standardtastatur in amerikanischem Englisch.

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

Ausgabe ist:

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

Vertraut werden mit dem Verhalten von Bashes:

Erstellen Sie eine Liste in einer Datei

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

Lesen Sie die Listendatei in eine Liste ein und zeigen Sie sie an

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

BASH-Befehlszeilenreferenzhandbuch: Spezielle Bedeutung bestimmter Zeichen oder Wörter für die Shell.

102
FireInTheSky

Sie können die Syntax von ${arrayName[@]} verwenden.

#!/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
41
Fizer Khan

Dies ist auch leicht zu lesen:

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

#Loop
for Path in "${FilePath[@]}"
do
    echo "$Path"
done

Überrascht, dass noch niemand dies gepostet hat - wenn Sie die Indizes der Elemente benötigen, während Sie sich durch das Array bewegen, können Sie dies tun:

arr=(foo bar baz)

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

Ausgabe:

0 foo
1 bar
2 baz

Ich finde das viel eleganter als den "traditionellen" For-Loop-Stil (for (( i=0; i<${#arr[@]}; i++ ))).

(${!arr[@]} und $i müssen nicht angegeben werden, da es sich nur um Zahlen handelt. Einige schlagen vor, sie trotzdem anzugeben, aber das ist nur eine persönliche Präferenz.)

18
Doorknob

Implizites Array für Skript oder Funktionen:

Zusätzlich zu anubhava s korrekter Antwort: Wenn die grundlegende Syntax für die Schleife lautet:

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

es gibt einen Sonderfall in bash :

Wenn Sie ein Skript oder eine Funktion ausführen, werden Argumente, die in den Befehlszeilen übergeben werden, der Arrayvariablen [email protected] zugewiesen. Sie können mit $1, $2, $3 usw. darauf zugreifen.

Dies kann (zu Testzwecken) von ausgefüllt werden

set -- arg1 arg2 arg3 ...

Ein loop over this array könnte einfach geschrieben werden:

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

Anmerkung dass das reservierte Werk in nicht vorhanden ist und auch kein Arrayname!

Stichprobe:

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: ....

Beachten Sie, dass dies dasselbe ist wie

for item in "[email protected]";do
    echo "This is item: $item."
  done

Dann in ein Skript :

#!/bin/bash

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

Speichern Sie dies dann in einem Skript myscript.sh, chmod +x myscript.sh

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

Dasselbe gilt für eine Funktion :

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

Dann

myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.
8
F. Hauri
listOfNames="db_one db_two db_three"
for databaseName in $listOfNames
do
  echo $databaseName
done

oder nur

for databaseName in db_one db_two db_three
do
  echo $databaseName
done
6
nroose

Das declare-Array funktioniert nicht für die Korn-Shell. Verwenden Sie das folgende Beispiel für die Korn-Shell:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

for i in ${promote_arry[*]};
    do
            echo $i
    done
5
Bhanu

Einfacher Weg :

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}
5
rashedcs

Dies ähnelt der Antwort von user2533809, aber jede Datei wird als separater Befehl ausgeführt.

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

while read -r line; do
    echo line: "$line"
done <<< "$names"
4
Jamie

Wenn Sie die Korn-Shell verwenden, gibt es "set -A databaseName", andernfalls "declare -a databaseName".

So schreiben Sie ein Skript, das auf allen Shells funktioniert:

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

done

Es sollte an allen Schalen gearbeitet werden.

3
The smart Eagle

Versuche dies. Es funktioniert und getestet.

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

# For accessing with the echo command: echo ${array[0]}, ${array[1]}
2
Simpal Kumar

Mögliche erste Zeile jedes Bash-Skripts/jeder Bash-Sitzung:

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

Verwenden Sie z.

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

Kann in Betracht ziehen: echo interpretiert -e als Option hier

2
elf12

Single Line Looping,

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

sie werden eine Ausgabe wie folgt erhalten,

db_a
db_b
db_c