Angenommen, ich habe ein sehr großes Array. Gibt $large_list
es eine Möglichkeit, eine Funktion zu schreiben, die das Array als Argument verwendet? Zum Beispiel:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
Was ist die übliche Strategie, um so etwas zu tun? Ich habe versucht, die Variable anzugeben, $large_list
aber sie war leer.
Ich bin bereit, die Funktion zu ändern, um sie an jede Änderung in der Argumentliste anzupassen.
Für die Aufzeichnung verwende ich ksh88 und suche nach Antworten, die so portabel wie möglich sind.
EDIT : Bisher war das Beste, was ich finden konnte, das Array zu durchlaufen und jedes Element als Argument an die Funktion zu senden. Dies scheint unglaublich hässlich und fehleranfällig zu sein, ganz zu schweigen davon, dass es schnell an ein Limit stoßen wird. Folgendes habe ich getan:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
Gibt es nicht etwas Besseres zu tun?
func "${array[@]}"
? Wenn Sie nur ein Element übergeben müssen, übergeben Sie einfach das Element - Sie müssen es nicht durch Übergeben eines Arrays und eines Index komplizierter machen."${array[$@]}
. Ihr Vorschlag funktioniert tatsächlich. Mea culpa.Antworten:
Um die Array-Elemente als Argumente an die Funktion zu übergeben, verwenden Sie die ksh-Syntax, um die Elemente des Arrays als Liste zu erweitern.
Das
[@]
Suffix macht dies zu einer Array-Erweiterung. Die doppelten Anführungszeichen schützen jedes Element vor weiterer Erweiterung (Teilen und Globbing). Das Ergebnis der Erweiterung ist im Allgemeinen nicht ein Wort, wie es normalerweise in doppelten Anführungszeichen steht, sondern so viele Wörter, wie Elemente im Array vorhanden sind.Das N- te Element des Arrays ist dann . Um darauf zuzugreifen, müssen Sie verwenden ; Siehe Verwenden einer Variablenreferenz "innerhalb" einer anderen Variablen
${N}
eval
quelle
myarray=("hello world" wibble)
(2 Elemente, von denen das erste ein Leerzeichen enthält):work_on_array "${myarray[@]}"
Übergibt 2 Parameterhello world
undwibble
;work_on_array ${myarray[@]}
2 Parameter übergibthello
,world
undwibble
. Und mitmyarray=(*)
, wirdwork_on_array ${myarray[@]}
die Liste der Dateien im aktuellen Verzeichnis übergeben. (Daher ist dies einer der vielen Fälle, in denen mein Rat einen praktischen Unterschied macht.)hello
,world
undwibble
3 Parameter machen.)In Bash 4.3+ gibt es einen Weg, der wahrscheinlich von ksh kommt:
Siehe auch
declare -n
.quelle
Hängt von der Korn Shell ab… die neuesten Versionen von AT & T ksh93 und mksh unterstützen dies:
In meiner aktuellen Shell gibt dies "b" aus.
quelle