110 votes

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

J'ai le bash suivant deux scripts

a.sh :

#!/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 :

  • Exécution de certaines applications uniquement par b.sh fonctionne comme prévu
  • Iterate+echo les arguments dans b.sh fonctionne comme prévu
  • Utilisation de $@ au lieu de $* ne fait pas de différence

7 votes

Essayer someApp "$*" o someApp "$@"

1 votes

Yupp - ça marche du tonnerre !

168voto

chepner Points 54078

$* non cotée, se développe en deux mots. Vous devez le citer de manière à ce que someApp reçoit un seul argument.

someApp "$*"

Il est possible que vous vouliez utiliser $@ à la place, de sorte que someApp recevrait deux arguments si vous appeliez b.sh comme

b.sh 'My first' 'My second'

Con someApp "$*" , someApp recevrait un seul argument My first My second . Avec someApp "$@" , someApp recevrait deux arguments, My first y My second .

31 votes

La clé qu'il est facile d'oublier est que "$@" doit être cité, semble-t-il. $@ ne suffit pas.

2 votes

@miracle2k Correct. Sans citation, $@ y $* fonctionnent de manière identique.

3 votes

@Matt Il s'agit de quelque chose d'entièrement différent. "$@" est spécial en ce sens qu'il cite chaque argument séparément. Il peut donc en résulter plus d'un argument. "$quelque chose" est juste un guillemet autour de ce que $quelque chose développe et sera toujours un seul argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X