Comment puis-je obtenir une tranche de $@
dans Bash sans avoir à copier au préalable tous les paramètres de position vers un autre tableau comme celui-ci?
argv=( "$@" ) echo "${argv[@]:2}";
Commentaires
Réponse
Vous pouvez utiliser le même format que pour tout autre tableau. Pour extraire les 2ème et 3ème éléments de $@
, vous devez faire:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Commentaires
- Mais cela semble fonctionner caractère par caractère dans la v4.1.2, y a-t-il un moyen de le faire mot par mot?
- @AlexejMagura I ne ' pas comprendre ce que vous voulez dire. Cela agit sur les éléments du tableau. Si vous avez des éléments à un caractère, cela fonctionnera " sur les caractères ". Si chaque élément est un mot, cela fonctionne sur les mots. Essayez-vous peut-être ceci sur une chaîne et non un tableau?
- Je ' essaie sur une copie de " $ @ ", qui, je suppose, pourrait devenir une chaîne à ce stade, je ' ne suis pas sûr.
- Sur bash 4.2.46,
"${@:1:2}"
me donne en fait les 1er et 2ème arguments de ligne de commande . Pendant ce temps,"${@:1}"
me donne les arguments de ligne de commande complets , et"${@:0}"
me donne le nom du script suivi darguments de ligne de commande complets . - @Rockallite bien, oui. Les 2ème et 3ème éléments du tableau
$@
sont les 1er et 2ème arguments."${@:1}"
affichera le tableau entier en commençant par le 2ème élément (le 1er argument) et${@:0}
le tableau entier à partir du 1er élément qui est le nom du script. À quoi vous attendiez-vous?
Réponse
Pour les paramètres de fonction, la réponse avec echo "${@:1:2}"
ne fonctionnait pas du tout pour moi. De plus, je voulais découper le premier élément, car cétait un paramètre différent. Ce qui a fonctionné était:
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[@]}" }
Peut-être que jécrirai pour tester pour voir comment cela fonctionne avec des arguments de position au niveau du script, mais pas de temps pour le moment.
Réponse
Je fais habituellement ceci:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
qui affichera:
message = first other = second third goforth
Vous pouvez développer le concept en shift
après le deuxième, troisième, etc. argument
"$@"
. Votreargv
affectation serait interrompue si des arguments contenaient des espaces.