Sie können die bash
Parametererweiterung verwenden , um einen Bereich anzugeben. Dies funktioniert auch mit Positionsparametern. Für $3
... $n
wäre es:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Seien Sie sich dessen bewusst $@
und $*
ignorieren Sie das erste Argument $0
. Wenn Sie sich fragen, welche Sie in Ihrem Fall verwenden sollen, ist es sehr wahrscheinlich, dass Sie ein Angebot wünschen $@
. Verwenden $*
Sie diese Option nur, wenn Sie ausdrücklich nicht möchten, dass die Argumente einzeln in Anführungszeichen gesetzt werden.
Sie können es wie folgt ausprobieren:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
Beachten Sie, dass das erste Beispiel $0
mit dem ersten Argument gefüllt ist, 0
während in einem Skript $0
stattdessen der Name des Skripts verwendet wird, wie das zweite Beispiel zeigt. Der Name des Skripts bash
natürlich ist das erste Argument, nur , dass es normalerweise nicht als solche wahrgenommen - das gleiche gilt für ein Skript ausführbar gemacht und „direkt“ genannt. Im ersten Beispiel haben wir also $0
= 0
, $1
= 1
usw., während es im zweiten $0
= script_file
, $1
= 0
, $2
= 1
usw. ist; ${@:3}
Wählt jedes Argument aus, das mit beginnt $3
.
Einige zusätzliche Beispiele für mögliche Bereiche:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Weitere Lektüre:
shift
Ansatz es unmöglich macht, darauf zuzugreifen,$1
und$2
nachdem Sie sie verschoben haben. In Ihrem Skript, das Sie$2
neben dem verwenden$variable_in_question
, müssen Sie entweder das ändern oder den Parametererweiterungsansatz verwenden.shift
gut ist , wenn das erste ein oder mehrere Argumente sind speziell und es macht Sinn , sie in separates Variablen herausgreifen (foo="$1"; bar="$2";
oderif [[ something with $1 ]];then blah blah; shift
. Aber @ Antwort des Desserts mit dem nicht-destruktiven Ansatz ist schön , in anderen Fällen , wenn Sie es später noch die vollständige Liste wollen , oder wenn Sie eine schickere Syntax verwenden, um einen begrenzten Bereich von Argumenten auszuwählen, nicht unendlich, ohne leere Argumente in einen Befehl einzufügen, wenn$@
nicht so viele Elemente vorhanden sind.Im Allgemeinen können Sie die Positionsparameter in ein Array kopieren, beliebige Indizes des Arrays löschen und das Array dann verwenden, um genau die gewünschten Indizes anzuzeigen, ohne die ursprünglichen Argumente zu verlieren.
Wenn ich zum Beispiel alle Argumente außer dem ersten, vierten und fünften haben möchte:
In der Kopie werden die Indizes um 1 verschoben, da dies
$0
nicht Teil von ist$@
.quelle
echo "${args[@]:2}"
für das drittletzte Argument.