Ü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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.