Übergeben von Argumenten mit Leerzeichen zwischen (Bash-) Skript

92

Ich habe die folgenden zwei Skripte

Asche:

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

b.sh:

#!/bin/bash
someApp $*

Die someApp-Binärdatei empfängt $*als 2 Argumente ('My' und 'Argument') anstelle von 1.

Ich habe verschiedene Dinge getestet:

  • Das Ausführen von someApp funktioniert nur b.shwie erwartet
  • Iterieren + Echo die Argumente in b.shfunktioniert wie erwartet
  • Verwenden $@statt $*macht keinen Unterschied
John Fear
quelle
6
versuchen Sie someApp "$*"odersomeApp "$@"
Russell Uhl
1
Yupp - wirkt wie ein Zauber!
John Fear

Antworten:

146

$*, nicht zitiert, erweitert sich auf zwei Wörter. Sie müssen es zitieren, damit es someAppein einzelnes Argument erhält.

someApp "$*"

Es ist möglich , dass Sie verwenden möchten $@stattdessen so , dass someAppzwei Argumente erhalten würden , wenn Sie anrufen waren b.shals

b.sh 'My first' 'My second'

Mit someApp "$*", someAppwürde ein einziges Argument erhalten My first My second. Mit someApp "$@", someAppwürden zwei Argumente erhalten, My firstund My second.

chepner
quelle
24
Der Schlüssel, der leicht zu übersehen ist, ist, dass "$ @" anscheinend in Anführungszeichen gesetzt werden muss. $ @ ist nicht genug.
Wunder2k
1
@ miracle2k Richtig. Nicht zitiert $@und $*identisch arbeiten.
Chepner
2
@Matt Das ist etwas ganz anderes. "$ @" ist insofern besonders, als es jedes Argument separat zitiert. Dies kann zu mehr als einem Argument führen. "$ etwas" ist nur ein Anführungszeichen um das, was $ etwas erweitert, und wird immer ein einziges Argument sein.
Carlo Wood
Die Antwort funktioniert bei mir nur, wenn ich einstelle IFS=$'\n'. Keine Ahnung warum.
Dominic M