Bash: Stück Positionsparameter

19

Wie kann ich ein Stück $@in Bash erhalten, ohne zuerst alle Positionsparameter in ein anderes Array wie dieses kopieren zu müssen?

argv=( "$@" )
echo "${argv[@]:2}";
nr
quelle
1
Immer zitieren "$@". Ihre argvZuweisung würde brechen, wenn irgendwelche Argumente Leerzeichen enthalten.
Jordan

Antworten:

31

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

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 
terdon
quelle
1
Aber dies scheint in Version 4.1.2 Zeichen für Zeichen zu funktionieren. Gibt es eine Möglichkeit, dies Wort für Wort zu tun?
Alexej Magura
@AlexejMagura Ich verstehe nicht, was du meinst. Das wirkt sich auf die Elemente des Arrays aus. Wenn Sie Ein-Zeichen-Elemente haben, funktioniert es "auf Zeichen". Wenn jedes Element ein Wort ist, funktioniert es mit Wörtern. Versuchen Sie das vielleicht an einem String und nicht an einem Array?
Terdon
Ich versuche es mit einer Kopie von "$ @", die an diesem Punkt vermutlich zu einer Zeichenfolge wird. Ich bin mir nicht sicher.
Alexej Magura
Gibt "${@:1:2}"mir in Bash 4.2.46 tatsächlich die 1. und 2. Befehlszeilenargumente . In der Zwischenzeit "${@:1}"erhalte ich die vollständigen Befehlszeilenargumente und "${@:0}"den Skriptnamen, gefolgt von den vollständigen Befehlszeilenargumenten .
Rockallite
@ Rockallite gut, ja. Das 2. und 3. Element des $@ Arrays sind das 1. und 2. Argument. "${@:1}"Gibt das gesamte Array aus, beginnend mit dem 2. Element (dem 1. Argument) und ${@:0}das gesamte Array beginnend mit dem 1. Element, das der Name des Skripts ist. Was hast du erwartet?
Terdon