Ich möchte so etwas machen:
foo=( )
foo[0]="bar"
foo[35]="baz"
for((i=0;i<${#foo[@]};i++))
do
echo "$i: ${foo[$i]}"
done
# Output:
# 0: bar
# 1:
Dann habe ich versucht, es mit for in zu durchlaufen:
foo=( )
foo[0]="bar"
foo[35]="baz"
for i in ${foo[@]}
do
echo "?: $i"
done
# Output:
# ?: bar
# ?: naz
aber hier kenne ich den indexwert nicht.
Ich weiß, du könntest so etwas
foo=( )
foo[0]="bar"
foo[35]="baz"
declare -p foo
# Output:
# declare -a foo='([0]="bar" [35]="baz")'
Aber kannst du es nicht anders machen?
(a b c)
, um es in ein Array zu konvertieren.[@]
und doppelten Anführungszeichen bedeutet, dass es sich nicht um eine "durch Leerzeichen getrennte Liste von Wörtern" handelt. Sie erhalten die Liste der tatsächlichen Array-Schlüssel, auch wenn die einzelnen Schlüssel Leerzeichen enthalten.The use of [@] and double quotes means it's not a "space separated list of words"
"${foo[@]}"
Nimmt die Variable (Array)foo
und erweitert sie als Array, wobei die Identität ihrer Elemente beibehalten wird, dh sie nicht in Leerzeichen aufgeteilt werden. Wennfoo=(x 'y z')
, dannf "${foo[@]}"
ruftf
mit zwei Argumenten auf,x
und'y z'
. Metadatenabfragen mögen"${!foo[@]}"
und"${#foo[@]}"
wirken ähnlichfoo
wie ein Array."${!foo[@]}"
ist die Liste aller im Array festgelegten Indizes".Sie können immer den Iterationsparameter verwenden:
quelle
((ITER++))
in der modernen Bashquelle
In Bash 4 können Sie assoziative Arrays verwenden:
In Bash 3 funktioniert dies (funktioniert auch in zsh):
quelle
quelle
Einfacher einzeiliger Trick zum Dumping des Arrays
Ich habe einen Wert mit Leerzeichen hinzugefügt:
Ich, für schnell Dump BashArrays oder assoziative Arrays, die ich benutze
Dieser einzeilige Befehl:
Wird rendern:
Erklärt
printf "%s\n" "${!foo[@]}"
druckt alle durch einen Zeilenumbruch getrennten Schlüssel ,printf "%s\n" "${foo[@]}"
druckt alle durch einen Zeilenumbruch getrennten Werte ,paste <(cmd1) <(cmd2)
führt die Ausgabe voncmd1
undcmd2
Zeile für Zeile zusammen.Tunning
Dies könnte durch
-d
Schalter eingestellt werden:oder auch:
Das assoziative Array funktioniert genauso:
Problem mit Zeilenumbrüchen oder Sonderzeichen
Leider gibt es mindestens eine Bedingung, die dazu führt, dass dies nicht mehr funktioniert: Wenn Variablen Zeilenumbrüche enthalten:
Der Befehl
paste
wird zeilenweise zusammengeführt, sodass die Ausgabe falsch wird:Für diese Arbeit können Sie
%q
anstelle des%s
zweitenprintf
Befehls (und des Whipe-Zitats) Folgendes verwenden:Wird perfekt machen:
Von
man bash
:quelle
printf "%q\n" "${var[@]}"
Newline war mein Problem!