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
"$@"
. Ihreargv
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