Как оценить аргументы функции с помощью цикла for
Я хочу разобрать аргументы моей функции с for
петля
func() {
for arg in $*; do
echo "$arg"
cone
}
Это прекрасно работает, если все мои аргументы без пробелов
func "111" "222" "333"
Но это не подходит для аргументов с пробелами
func "111" "222 222" "333"
2 ответа
Не использовать $*
использовать "$@"
вместо:
for arg in "$@" ; do
echo "$arg"
done
Пояснение: без двойных кавычек, $*
а также $@
идентичны Внутри двойных кавычек они разные. Смотрите "Специальные параметры" в man bash
для деталей:
*
Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS. То есть,"$*"
эквивалентно"$1c$2c..."
, гдеc
является первым символом значения переменной IFS. Если IFS не установлен, параметры разделяются пробелами. Если IFS равен нулю, параметры объединяются без промежуточных разделителей.
@
Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово. То есть,"$@"
эквивалентно"$1" "$2"
... Если раскрытие в двойных кавычках происходит внутри слова, расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра объединяется с последней частью исходного слова. Когда нет позиционных параметров,"$@"
а также$@
расширяться до нуля (т.е. они удаляются).
Используйте эту функцию с "$@"
вместо без кавычек $*
:
func() { for arg in "$@"; do echo "$arg"; done; }
Тогда назовите это как:
func "111" "222 222" "333"
111
222 222
333