Passer des arguments pour fonctionner exactement tel quel

10

J'ai la fonction suivante:

bar() { echo $1:$2; }

J'appelle cette fonction à partir d' une autre fonction foo,. foolui-même est appelé comme suit:

foo "This is" a test

Je veux obtenir la sortie suivante:

This is:a

Autrement dit, les arguments qui barreçoivent doivent être les mêmes jetons que je passe foo.

Comment foofaut-il mettre en œuvre pour y parvenir? J'ai essayé les deux implémentations suivantes, mais aucune ne fonctionne:

  • foo() { bar $*; }

    - production: this:is

  • foo() { bar "$*"; }

    - production: this is a test:

Ma question est de savoir comment conserver la citation des arguments. Est-ce possible?

Konrad Rudolph
la source

Réponses:

14

Utilisation "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"et "$*"ont des significations spéciales:

  • "$@"se développe en plusieurs mots sans effectuer d'extensions pour les mots (comme "$1" "$2" ...).
  • "$*" joint les paramètres de position avec le premier caractère dans IFS (ou espace si IFS n'est pas défini ou rien si IFS est vide).
Lri
la source
Merci, je ne savais pas qui $*avait cette sémantique - maintenant c'est logique. Je pense que cette réponse résout en fait un autre problème que j'ai rencontré lors de l'itération sur des tableaux…
Konrad Rudolph
6

Vous devez utiliser $@, au lieu de$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

sortie

This is:a

Pourquoi ça marche?

Parce qu'avec $*, tous les paramètres sont vus comme un seul mot , cela signifie que vous passerez This is a testà barfonctionner. Dans ce cas, le 1er paramètre passe à la barre de fonction est This, le 2e est is.

Avec $@, chaque paramètre est une chaîne entre guillemets , cela signifie que vous passerez 'This is' 'a' 'test'en fonction bar. Ainsi, le 1er paramètre passe à la barre de fonction est This is, le 2e est a.

cuonglm
la source