Bash: Slice mit Positionsparametern

Wie kann ich ein Slice mit $@ in Bash erhalten, ohne es zuerst kopieren zu müssen? Alle Positionsparameter zu einem anderen Array wie diesem?

argv=( "$@" ) echo "${argv[@]:2}"; 

Kommentare

  • Zitieren Sie immer "$@". Ihre argv Zuweisung würde unterbrochen, wenn Argumente Leerzeichen enthalten.

Antwort

Sie können dasselbe Format wie für jedes andere Array verwenden. Um das 2. und 3. Element aus $@ zu extrahieren, gehen Sie wie folgt vor:

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

Kommentare

  • Aber dies scheint in Version 4.1.2 auf Zeichenbasis zu funktionieren. Gibt es eine Möglichkeit, dies Wort für Wort zu tun?
  • @AlexejMagura I. ' verstehe nicht, was du meinst. Das wirkt sich auf die Elemente des Arrays aus. Wenn Sie Elemente mit einem Zeichen haben, funktioniert " für Zeichen ". Wenn jedes Element ein Wort ist, funktioniert es mit Wörtern. Versuchen Sie dies möglicherweise an einer Zeichenfolge und nicht an einem Array?
  • Ich ' versuche es an einer Kopie von " $ @ ", von dem ich vermute, dass es zu diesem Zeitpunkt zu einer Zeichenfolge wird. Ich ' bin mir nicht sicher.
  • In Bash 4.2.46 gibt mir "${@:1:2}" tatsächlich die Befehlszeilenargumente 1. und 2. . In der Zwischenzeit gibt mir "${@:1}" die vollständigen Befehlszeilenargumente und "${@:0}" gibt mir den Skriptnamen gefolgt von vollständigen Befehlszeilenargumenten .
  • @Rockallite gut, ja. Das 2. und 3. Element des Arrays $@ sind das 1. und 2. Argument. "${@:1}" druckt das gesamte Array beginnend mit dem 2. Element (dem 1. Argument) und ${@:0} das gesamte Array ab dem 1. Element der Name des Skripts. Was haben Sie erwartet?

Antwort

Für Funktionsparameter die Antwort mit echo "${@:1:2}" hat bei mir überhaupt nicht funktioniert. Außerdem wollte ich das erste Element abschneiden, da es sich um einen anderen Parameter handelt. Was funktioniert hat, war:

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

Vielleicht schreibe ich, um zu testen, wie dies mit Positionsargumenten auf Skriptebene funktioniert, aber momentan keine Zeit.

Antwort

Normalerweise mache ich Folgendes:

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

, das Folgendes ausgibt:

message = first other = second third goforth 

Sie können das Konzept erweitern, indem Sie shift nach dem zweiten, dritten usw. Argument

eingeben

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.