Передавайте аргументы, чтобы они функционировали точно как есть


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 пуст).

Спасибо, я не знал, что $*это семантика - теперь это логично. Я думаю, что этот ответ на самом деле решает другую проблему, с которой я сталкивался при переборе массивов ...
Конрад Рудольф

6

Вы должны использовать $@вместо$*

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

foo() { bar "$@"; }

foo "This is" a test

Ouput

This is:a

Почему это работает?

Поскольку с $*, все параметры рассматриваются как одно слово , это означает, что вы перейдете This is a testк barфункции. В этом случае 1-й проход параметра в функциональную панель - это This2-й is.

С $@каждым параметром является строка в кавычках , это означает, что вы перейдете 'This is' 'a' 'test'к функции bar. Таким образом, 1-й проход параметра в функциональную панель - это This is2-й a.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.