J'ai la fonction suivante:
bar() { echo $1:$2; }
J'appelle cette fonction à partir d' une autre fonction foo
,. foo
lui-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 bar
reçoivent doivent être les mêmes jetons que je passe foo
.
Comment foo
faut-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?
Réponses:
Utilisation
"$@"
:"$@"
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).la source
$*
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…Vous devez utiliser
$@
, au lieu de$*
sortie
Pourquoi ça marche?
Parce qu'avec
$*
, tous les paramètres sont vus comme un seul mot , cela signifie que vous passerezThis is a test
àbar
fonctionner. Dans ce cas, le 1er paramètre passe à la barre de fonction estThis
, le 2e estis
.Avec
$@
, chaque paramètre est une chaîne entre guillemets , cela signifie que vous passerez'This is'
'a'
'test'
en fonctionbar
. Ainsi, le 1er paramètre passe à la barre de fonction estThis is
, le 2e esta
.la source