Как оценить аргументы функции с помощью цикла 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
Другие вопросы по тегам