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


93

У мене є наступні два сценарії bash

зола:

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

b.sh:

#!/bin/bash
someApp $*

Бінарний файл someApp отримує $*як 2 аргументи ('My' та 'Argument') замість 1.

Я протестував кілька речей:

  • Запуск someApp працює лише через b.shроботу, як очікувалося
  • Повторіть + повторіть аргументи у b.shроботах, як очікувалося
  • Використання $@замість $*не робить різниці

6
спробувати someApp "$*"абоsomeApp "$@"
Рассел Ул

1
Юпп - працює як шарм!
John Fear

Відповіді:


147

$*, без котирувань, розширюється до двох слів. Вам потрібно процитувати це так, щоб someAppотримати один аргумент.

someApp "$*"

Можливо, ви хочете використовувати $@замість цього, тож ви someAppотримаєте два аргументи, якщо ви хочете зателефонувати b.shяк

b.sh 'My first' 'My second'

З someApp "$*", someAppотримав би один аргумент My first My second. З someApp "$@", someAppотримав би два аргументи, My firstі My second.


24
Ключ, який легко пропустити, це те, що, здається, потрібно вказати "$ @". $ @ недостатньо.
miracle2k

1
@ miracle2k Правильно. Без котирувань $@і $*працюють однаково.
chepner

2
@Matt Це щось зовсім інше. "$ @" особливий тим, що він цитує кожен аргумент окремо. Таким чином, це може спричинити більше одного аргументу. "$ something" - це просто лапки навколо того, до чого $ щось розширюється, і завжди буде єдиним аргументом.
Carlo Wood

Відповідь працює для мене, лише якщо я встановлюю IFS=$'\n'. Не знаю, чому.
Домінік М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.