Wie konvertiere ich Befehlszeilenargumente in ein Bash-Skript-Array?
Ich möchte das nehmen:
./something.sh arg1 arg2 arg3
und konvertieren Sie es in
myArray=( arg1 arg2 arg3 )
damit ich myArray zur weiteren Verwendung im Skript verwenden kann.
Dieser vorherige SO-Beitrag kommt dem nahe, befasst sich jedoch nicht mit dem Erstellen eines Arrays: Wie analysiere ich Befehlszeilenargumente in Bash?
Ich muss die Argumente in ein reguläres Bash-Skript-Array konvertieren. Mir ist klar, dass ich andere Sprachen verwenden könnte (z. B. Python), dies aber in Bash tun muss. Ich schätze, ich suche eine "Anhängen" -Funktion oder ähnliches?
UPDATE: Ich wollte auch fragen, wie man nach Null-Argumenten sucht und einen Standard-Array-Wert zuweist, und dank der folgenden Antwort konnte dies funktionieren:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
Mit dieser Option können Sie Positionsparameter für den Bereich festlegen. Außerdem können Sie Shell-Optionen festlegen. Sie können dies tunset foo
, was bedeutet, dass die$1
Erweiterung auf "foo" erfolgt. Wenn Ihre Parameter jedoch mit einem Bindestrich beginnen,set
wird davon ausgegangen, dass Sie eine Shell-Option festlegen möchten. Der Doppelstrich stellt sicher, dass alle folgenden Parameter als einzustellende Positionsparameter interpretiert werden.echo $@
druckt alle Argumente, aberecho $myArray
nur das erste Element. Verwenden Sie, um sie alle zu sehenecho ${myArray[@]}
."${myArray[@]}"
. Wenn Sie das Array durchlaufen möchten, benötigen Sie die Anführungszeichen, um zu vermeiden, dass die einzelnen Elemente auf IFSVielleicht kann das helfen:
Sie können auch über Argumente iterieren, indem Sie 'in' weglassen:
wird gleichwertig sein
quelle
arg
Feld zu setzen ist - ist es eine vordefinierte Variable?${var}
wird auf den Inhalt von erweitertvar
.${var[n]}
wird auf den Inhalt des Elementsn
des Arrays erweitertvar
. Wird${var[@]}
erweitert dann das gesamte Array, dh${var[0]} ${var[1]} ... ${var[n]}
(mitn
dem letzten Element des Index ist)?Tatsächlich kann auf die Liste der Parameter mit
$1 $2 ...
usw. zugegriffen werden .Dies entspricht genau:
Die Liste der Parameter kann also mit set geändert werden
und
${!i}
ist der richtige Weg, um darauf zuzugreifen:Für Ihren speziellen Fall kann dies verwendet werden (ohne dass Arrays erforderlich sind), um die Liste der Argumente festzulegen, wenn keine angegeben wurden:
was zu diesem noch einfacheren Ausdruck führt:
quelle
echo "$#" "$i+1" "${!i}";
um die Ausgabe genau wie gezeigt zu erhalten?Hier ist eine andere Verwendung:
quelle
Einfacher Sie können jedoch direkt arbeiten
$@
;)So übergeben Sie eine Liste von Argumenten direkt an der Eingabeaufforderung:
quelle
for stuff in "$@" ; do ...
ist dasselbe wiefor stuff ; do ...
:)Nebeneinander Ansicht, wie das Array und $ @ praktisch gleich sind.
Code:
Eingang:
Ausgabe:
quelle
Hervorzuheben ist die Bedeutung der doppelten Anführungszeichen. Angenommen, ein Argument enthält Leerzeichen.
Code:
Ausgabe:
quelle