Mühe dich eine Weile, ein Array als Argument zu übergeben, aber es funktioniert trotzdem nicht. Ich habe wie folgt versucht:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Eine Antwort mit Erklärung wäre nett.
Bearbeiten: Grundsätzlich werde ich die Funktion irgendwann aus einer anderen Skriptdatei aufrufen. Bitte erläutern Sie die Einschränkungen, wenn möglich.
copyFiles {…}
undcopyFiles(){…}
undcopyFiles() {…}
, aber nichtcopyFiles{…}
. Beachten Sie das Leerzeichen in der Variante ohne()
Sie können das Array auch als Referenz übergeben. dh:
Beachten Sie jedoch, dass alle Änderungen an arr an array vorgenommen werden.
quelle
Wenn Sie ein oder mehrere Argumente UND ein Array übergeben möchten, schlage ich vor, dass diese Änderung am Skript von @AB
Array das letzte Argument sein sollte und nur ein Array übergeben werden kann
Ausgabe:
quelle
shift
Nutzung.shift 6
.arr
. Ist es möglich, einen Array-Parameter in der Mitte zu haben? Oder sogar mehrere Array-Parameter?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Wie würde ich es in Python definieren:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. EgalEs gibt einige Probleme. Hier ist die Arbeitsform:
Zwischen Funktionsdeklaration und muss mindestens ein Leerzeichen stehen
{
Sie können nicht verwenden
$array
, daarray
es sich bei einem Array nicht um eine Variable handelt. Wenn Sie alle Werte eines Arrays erhalten möchten, verwenden Sie"${array[@]}"
In Ihrer Hauptfunktionsdeklaration müssen Sie
arr="$@"
als"${array[@]}"
Erweiterung die durch Leerzeichen getrennten indizierten Werte verwenden, wenn Sie verwenden$1
, würden Sie nur den ersten Wert erhalten. Um alle Werte zu erhalten, verwenden Siearr="$arr[@]}"
.quelle
arr=("$@")
break
unten einecho "$i"
. In Ihrer Version sehen Sie weiterhin alle Elemente. Es sollten jedoch drei Zeilen sein.Hier folgt ein etwas größeres Beispiel. Erläuterungen finden Sie in den Kommentaren im Code.
quelle
Der beste Weg ist, als Positionsargumente zu übergeben. Nichts anderes. Sie können als Zeichenfolge übergeben, dies kann jedoch zu Problemen führen. Beispiel:
oder
Ausgabe:
Sie meinen, wenn der Array-Wert Leerzeichen enthält, müssen Sie die Elemente zuerst in Anführungszeichen setzen, bevor Sie auf den Wert durch den Index in der Funktion zugreifen. Verwenden Sie dazu die Positionsparameter $ 1 $ 2 $ 3 .... Wobei Index 0 -> 1, 1 -> 2, ... Um den Zugriff zu iterieren, ist es am besten, immer $ 1 und nach der Umschalttaste zu verwenden. Es wird nichts zusätzliches benötigt. Sie können Argumente ohne ein Array wie dieses übergeben:
bash media erstellt automatisch ein Array aus übergebenen Argumenten, die an function übergeben wurden, und Sie haben dann Positionsargumente. Wenn Sie außerdem $ {array [2]} schreiben, schreiben Sie wirklich das folgende Argument eins, zwei, drei, vier und übergeben es an die Funktion. Diese Anrufe sind also gleichwertig.
quelle
So hässlich es auch ist, hier ist eine Problemumgehung, die funktioniert, solange Sie nicht explizit ein Array übergeben, sondern eine Variable, die einem Array entspricht:
Ich bin sicher, dass jemand eine sauberere Implementierung der Idee finden kann, aber ich habe festgestellt, dass dies eine bessere Lösung ist, als ein Array als zu übergeben
"{array[@]"}
und dann intern darauf zuzugreifenarray_inside=("$@")
. Dies wird kompliziert, wenn andere Positions- /getopts
Parameter vorhanden sind. In diesen Fällen musste ich zuerst die Parameter ermitteln und dann entfernen, die nicht mit dem Array verknüpft waren, indem ich eine Kombination ausshift
und Entfernung von Array-Elementen verwendete.Eine puristische Perspektive betrachtet diesen Ansatz wahrscheinlich als eine Verletzung der Sprache, aber pragmatisch gesehen hat dieser Ansatz mir viel Kummer erspart. Zu einem verwandten Thema verwende ich auch
eval
, um einer Variablen mit dem Namen eines Parameters, dentarget_varname
ich an die Funktion übergebe , ein intern erstelltes Array zuzuweisen :quelle
array_internally
einen Alias davon:declare -n array_internally=$1
. Und der Rest davon über "wird kompliziert" und "bestimmen und dann entfernen ..." gilt unabhängig davon, wie Sie das Array übergeben, also verstehe ich nicht, was der Sinn davon ist. Undeval
ein Array, das möglicherweise Sonderzeichen enthält, wartet nur darauf, dass es zu einem späteren Zeitpunkt zu Trauer kommt.