Передача аргументов с пробелами между (bash) скриптом

94

У меня есть следующие сценарии bash two

a.sh:

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

b.sh:

#!/bin/bash
someApp $*

Двоичный файл someApp получает $*2 аргумента («Мой» и «Аргумент») вместо 1.

Я проверил несколько вещей:

  • Запуск someApp только через b.shработает должным образом
  • Итерировать + повторить аргументы в b.shработе, как ожидалось
  • Использование $@вместо $*не имеет значения
Джон Страх
источник
6
попробуйте someApp "$*"илиsomeApp "$@"
Рассел Уль
1
Yupp - работает как шарм!
John Fear

Ответы:

152

$*, без кавычек, заменяется двумя словами. Вам нужно процитировать его, чтобы someAppполучить единственный аргумент.

someApp "$*"

Возможно, вы захотите использовать $@вместо этого, чтобы someAppполучить два аргумента, если бы вы вызывали b.shкак

b.sh 'My first' 'My second'

С someApp "$*", someAppполучит единственный аргумент My first My second. С someApp "$@", someAppполучил бы два аргумента, My firstи My second.

Чепнер
источник
25
Ключ, который легко упустить, - это то, что "$ @", кажется, нужно заключать в кавычки. $ @ недостаточно.
miracle2k
1
@ miracle2k Правильно. Без кавычек $@и $*работают идентично.
chepner
2
@Matt Это нечто совсем другое. Особенность "$ @" в том, что он цитирует каждый аргумент отдельно. Таким образом, это может привести к более чем одному аргументу. «$ something» - это просто кавычки вокруг того, что $ something расширяется, и всегда будет единственным аргументом.
Carlo Wood
Ответ работает для меня, только если я установил IFS=$'\n'. Понятия не имею почему.
Dominic M