Передайте аргументи, щоб функціонувати саме так, як є


10

У мене є така функція:

bar() { echo $1:$2; }

Я називаю цю функцію з іншої функції, foo. fooсебе називають так:

foo "This is" a test

Я хочу отримати такий результат:

This is:a

Тобто аргументи, які barотримує, повинні бути тими ж лексемами, які я передаю foo.

Як це fooпотрібно здійснити для досягнення цього? Я спробував дві наступні реалізації, але не працює:

  • foo() { bar $*; }

    - вихід: this:is

  • foo() { bar "$*"; }

    - вихід: this is a test:

Моє питання ефективно, як я можу зберегти цитування аргументів. Чи можливо це взагалі?


Відповіді:


14

Використання "$@":

$ bar() { echo "$1:$2"; }
$ foo() { bar "$@"; }
$ foo "This is" a test
This is:a

"$@"і "$*"мають особливі значення:

  • "$@"розширюється на кілька слів, не виконуючи розширень для слів (як "$1" "$2" ...).
  • "$*" приєднує позиційні параметри з першим символом в IFS (або пробіл, якщо IFS не встановлений, або нічого, якщо IFS порожній).

Дякую, я не знав, що $*це семантично - тепер це логічно. Я думаю, що ця відповідь насправді вирішує ще одну проблему, з якою у мене виникали під час ітерації масивів…
Konrad Rudolph

6

Ви повинні використовувати $@замість цього$*

bar() { echo "$1:$2"; }

foo() { bar "$@"; }

foo "This is" a test

вийти

This is:a

Чому це працює?

Оскільки з $*, весь параметр розглядається як одне слово , це означає, що ви перейдете This is a testдо barфункції. У цьому випадку перехід першого параметра у функціональну панель є This, другий - це is.

З $@, кожен параметр - це кодований рядок , це означає, що ви перейдете 'This is' 'a' 'test'до функції bar. Отже, перехід 1-го параметра до панелі функцій є This isдругим a.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.