Bash: tranche de paramètres positionnels

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

  • Toujours citer "$@". Votre argv affectation serait interrompue si des arguments contenaient des espaces.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *