У меня есть следующая функция:
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:
Мой вопрос заключается в том, как я могу сохранить цитирование аргументов. Это вообще возможно?
Ответы:
Используйте
"$@"
:"$@"
и"$*"
имеют особые значения:"$@"
расширяется до нескольких слов без выполнения расширений для слов (например"$1" "$2" ...
)."$*"
объединяет позиционные параметры с первым символом в IFS (или пробел, если IFS не установлен, или ничего, если IFS пуст).источник
$*
это семантика - теперь это логично. Я думаю, что этот ответ на самом деле решает другую проблему, с которой я сталкивался при переборе массивов ...Вы должны использовать
$@
вместо$*
Ouput
Почему это работает?
Поскольку с
$*
, все параметры рассматриваются как одно слово , это означает, что вы перейдетеThis is a test
кbar
функции. В этом случае 1-й проход параметра в функциональную панель - этоThis
2-йis
.С
$@
каждым параметром является строка в кавычках , это означает, что вы перейдете'This is'
'a'
'test'
к функцииbar
. Таким образом, 1-й проход параметра в функциональную панель - этоThis is
2-йa
.источник