Vous pouvez utiliser l' bash
extension des paramètres pour spécifier une plage, cela fonctionne également avec les paramètres de position. Pour $3
… $n
ce serait:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Soyez conscient des deux $@
et $*
ignorez le premier argument $0
. Si vous vous demandez lequel utiliser dans votre cas: il est très probable que vous souhaitiez un devis $@
. N'utilisez pas $*
sauf si vous ne voulez pas explicitement que les arguments soient cités individuellement.
Vous pouvez l'essayer comme suit:
$ 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
Notez que dans le premier exemple $0
est rempli avec le premier argument 0
tandis que lorsqu'il est utilisé dans un script $0
est plutôt rempli avec le nom du script, comme le montre le deuxième exemple. Le nom du script estbash
bien sûr le premier argument, juste qu'il n'est normalement pas perçu comme tel - il en va de même pour un script rendu exécutable et appelé "directement". Ainsi, dans le premier exemple, nous avons = , = etc. tandis que dans le second, c'est = , = , = etc .; sélectionne chaque argument commençant par .$0
0
$1
1
$0
script_file
$1
0
$2
1
${@:3}
$3
Quelques exemples supplémentaires pour les plages possibles:
# 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
Lectures complémentaires:
shift
approche rendra l'accès impossible$1
et$2
après que vous les ayez déplacés. Dans votre script que vous utilisez$2
aux côtés de$variable_in_question
, vous devez soit changer cela, soit utiliser l'approche d'extension des paramètres.shift
est bon quand le premier ou plusieurs args sont sens particulier et il fait de les choisir dans des variables distinctes (foo="$1"; bar="$2";
ouif [[ something with $1 ]];then blah blah; shift
. Mais @ réponse de dessert avec l'approche non destructive est bien dans d' autres cas où vous ne voulez toujours la liste complète plus tard , ou lorsque vous utilisez une syntaxe plus sophistiquée pour sélectionner une plage limitée d'arguments, pas à l'infini, sans introduire d'arguments vides dans une commande si$@
elle ne contient pas autant d'éléments.En règle générale, vous pouvez copier les paramètres de position dans un tableau, supprimer des indices arbitraires du tableau, puis utiliser le tableau pour développer exactement les indices souhaités, sans perdre vos arguments d'origine.
Par exemple, si je voulais tous les arguments sauf les premier, quatrième et cinquième:
Dans la copie, les indices sont décalés de 1, car
$0
ne fait pas partie de$@
.la source
echo "${args[@]:2}"
pour le troisième au dernier argument.