Passer des arguments avec des espaces entre le script (bash)

93

J'ai les deux scripts suivants

cendre:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

Le binaire someApp reçoit $*comme 2 arguments («My» et «Argument») au lieu de 1.

J'ai testé plusieurs choses:

  • L'exécution de someApp uniquement b.shfonctionne comme prévu
  • Itérer + faire écho aux arguments dans b.shfonctionne comme prévu
  • Utiliser $@au lieu de $*ne fait pas de différence
John Fear
la source
6
essayer someApp "$*"ousomeApp "$@"
Russell Uhl
1
Yupp - fonctionne comme un charme!
John Fear

Réponses:

147

$*, sans guillemets, se développe en deux mots. Vous devez le citer pour qu'il someAppreçoive un seul argument.

someApp "$*"

Il est possible que vous souhaitiez utiliser à la $@place, de sorte que someAppcela recevrait deux arguments si vous deviez appeler b.shcomme

b.sh 'My first' 'My second'

Avec someApp "$*", someApprecevrait un seul argument My first My second. Avec someApp "$@", someApprecevrait deux arguments, My firstet My second.

chepner
la source
24
La clé qui est facile à manquer est que "$ @" doit être cité, semble-t-il. $ @ ne suffit pas.
miracle2k
1
@ miracle2k Correct. Sans guillemets $@et $*fonctionnent à l'identique.
chepner
2
@Matt C'est quelque chose d'entièrement différent. "$ @" est spécial en ce sens qu'il cite chaque argument séparément. Cela peut donc entraîner plus d'un argument. "$ quelque chose" est juste des guillemets autour de tout ce que $ quelque chose se développe et sera toujours un argument unique.
Carlo Wood
La réponse ne fonctionne pour moi que si je fixe IFS=$'\n'. Je ne sais pas pourquoi.
Dominic M