Ich möchte ein Skript schreiben, das 15 Zeichenfolgen durchläuft (Array möglicherweise?). Ist das möglich?
Etwas wie:
for databaseName in listOfNames
then
# Do something
end
Sie können es so verwenden:
## 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"
)
Das ist natürlich möglich.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Weitere Informationen finden Sie unter Bash-Schleifen für, während und bis .
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
.Keine dieser Antworten enthält einen Zähler ...
Ausgabe:
quelle
echo "$i / ${arraylength} : ${array[$i-1]}"
- Wenn Ihr$i
Glob einen Globus enthält, wird er erweitert, wenn er eine Registerkarte enthält, in die er geändert wird ein Leerzeichen usw.Ja
Ausgabe:
Räume bewahren; Einträge in Listen mit einfachen oder doppelten Anführungszeichen und Erweiterungen mit doppelten Anführungszeichen.
Ausgabe:
Liste über mehrere Zeilen erstellen
Ausgabe:
Einfache Listenvariable
oder
Zeigen Sie die Listenvariable an:
Ausgabe:
Durchlaufen Sie die Liste:
Ausgabe:
Erstellen Sie eine Funktion, um eine Liste durchzugehen:
Verwenden Sie das Schlüsselwort declare (Befehl), um die Liste zu erstellen, die technisch als Array bezeichnet wird:
Ausgabe:
Erstellen eines assoziativen Arrays. Ein Wörterbuch:
Ausgabe:
CVS-Variablen oder -Dateien in eine Liste aufnehmen .
Ändern des internen Feldtrennzeichens von einem Leerzeichen nach Belieben.
Im folgenden Beispiel wird es in ein Komma geändert
Ausgabe:
Wenn Sie sie nummerieren müssen:
Dies wird als Back Tick bezeichnet. Setzen Sie den Befehl in Back Ticks.
Es befindet sich neben der Nummer eins auf Ihrer Tastatur und oder über der Tabulatortaste. Auf einer Standardtastatur in amerikanischer englischer Sprache.
Ausgabe ist:
Machen Sie sich mit dem Verhalten von Bashes vertraut:
Erstellen Sie eine Liste in einer Datei
Lesen Sie die Listendatei in eine Liste ein und zeigen Sie sie an
BASH-Befehlszeilenreferenzhandbuch: Besondere Bedeutung bestimmter Zeichen oder Wörter für die Shell.
quelle
"${List[@]}"
korrekt sein, mit den Anführungszeichen .${List[@]}
ist falsch.${List[*]}
ist falsch. Versuchen Sie esList=( "* first item *" "* second item *" )
- Sie erhalten das richtige Verhalten fürfor item in "${List[@]}"; do echo "$item"; done
, aber nicht für eine andere Variante.List=( "first item" "second item" )
wird in gebrochen werdenfirst
,item
,second
,item
als auch).ls
Ausgabe analysieren , was gegen bewährte Verfahren verstößt .Im gleichen Sinne wie 4ndrews Antwort:
B. Kein Leerzeichen in den Namen:
Anmerkungen
listOfNames="RA RB R C RD"
die gleiche Ausgabe.Andere Möglichkeiten, Daten einzugeben, sind:
Lesen Sie von stdin
IFS='\n'
oder für MacOSIFS='\r'
) zuzulassen.#!/bin/bash
oben in die Skriptdatei zeigt die Ausführungsumgebung an.Andere Quellen ( während der Leseschleife )
quelle
IFS
. (Geben Sie für alleIFS
ein bestimmtes Trennzeichen an, mit dem andere Leerzeichen in Zeichenfolgen eingefügt werden können, ohne in Teilzeichenfolgen getrennt zu werden.)$databaseName
enthält nur die gesamte Liste, führt also nur eine einzige Iteration durch.Sie können die Syntax von verwenden
${arrayName[@]}
quelle
Überrascht, dass dies noch niemand gepostet hat - wenn Sie die Indizes der Elemente benötigen, während Sie das Array durchlaufen, können Sie dies tun:
Ausgabe:
Ich finde das viel eleganter als den "traditionellen" For-Loop-Stil (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
und$i
müssen nicht zitiert werden, weil es sich nur um Zahlen handelt; einige würden vorschlagen, sie trotzdem zu zitieren, aber das ist nur eine persönliche Präferenz.)quelle
Dies ist auch leicht zu lesen:
quelle
IFS=$'\n'
Dies funktioniert möglicherweise auch für andere Lösungen in diesem Szenario.Implizites Array für Skript oder Funktionen:
Zusätzlich zu Anubhavas korrekter Antwort: Wenn die grundlegende Syntax für die Schleife lautet:
Es gibt einen Sonderfall inBash::
Wenn ein Skript oder eine Funktion ausgeführt wird , Argumente werden auf Befehlszeilen übergeben zugeordnet werden
$@
Array - Variable, können Sie durch Zugriff$1
,$2
,$3
, und so weiter.Dies kann (zu Testzwecken) von ausgefüllt werden
Eine Schleife über dieses Array könnte einfach geschrieben werden:
Beachten Sie, dass die reservierte Arbeit
in
nicht vorhanden ist und auch kein Array-Name!Stichprobe:
Beachten Sie, dass dies dasselbe ist wie
Dann in ein Skript :
Speichern Sie diese in einem Skript
myscript.sh
,chmod +x myscript.sh
dannGleiches in einer Funktion :
Dann
quelle
oder nur
quelle
Einfacher Weg :
quelle
Das Deklarationsarray funktioniert nicht für die Korn-Shell. Verwenden Sie das folgende Beispiel für die Korn-Shell:
quelle
for i in ${foo[*]}
ist im Grunde immer das Falsche -for i in "${foo[@]}"
ist die Form, die die Grenzen der ursprünglichen Liste beibehält und die Glob-Erweiterung verhindert. Und das Echo muss seinecho "$i"
Dies ähnelt der Antwort von user2533809, aber jede Datei wird als separater Befehl ausgeführt.
quelle
Wenn Sie die Korn-Shell verwenden, gibt es " set -A databaseName ", andernfalls gibt es " declare -a databaseName ".
Um ein Skript zu schreiben, das an allen Shells arbeitet,
Es sollte an allen Muscheln gearbeitet werden.
quelle
$ bash --version
GNU bash, Version 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: Syntaxfehler in der Nähe eines unerwarteten Tokens `('Versuche dies. Es funktioniert und getestet.
quelle
array=( "hello world" )
, oderarrray=( "*" )
; im ersten Fall wird es gedruckthello
undworld
separat, im zweiten wird es eine Liste von Dateien anstelle der*
Mögliche erste Zeile jedes Bash-Skripts / jeder Bash-Sitzung:
Verwenden Sie zB:
Kann berücksichtigen:
echo
interpretiert hier-e
als Optionquelle
Einzeilige Schleife,
Sie erhalten eine Ausgabe wie folgt:
quelle
Was ich dafür wirklich brauchte, war ungefähr so:
Zum Beispiel:
(Würde alle Prozesse mit vlc in ihrem Namen beenden)
quelle
Ich durchlaufe eine Reihe meiner Projekte, um ein
git pull
Update zu erhalten:quelle