Ответ Денниса хорош, поэтому я сосредоточусь на том, почему ваш код не работает.Давайте использовать вспомогательную функцию, чтобы показать аргументы, полученные функцией:
$ args() { for x in "$@"; do echo $x; done }
$ args 1 '2 b' 3
1
2 b
3
Хорошо, как и ожидалось, кавычки используются исключительно для разделения аргументов.Но теперь давайте использовать переменную как вы:
$ var="1 '2 b' 3"
$ args $var
1
'2
b'
3
Bash раскрывает переменную, и функция (или команда) получает кавычки.Конечно, это не то, что вы хотели.
Solution1: используйте eval для повторной интерпретации кавычек.
$ eval args $var
1
2 b
3
Solution2: используйте массив и разверните его с помощью $} "как показал Деннис.
Больше идей: техника, которую я иногда использовал, выполняет eval снаружи:
$ eval "$(create_args_list VARNAME)"
В этом случае otherfun вернет строку, которая, если ее уклонитьсоздаст переменную с именем VARNAME (которая может быть даже локальной).Эта переменная (или переменные, если необходимо) может быть строкой или массивом.Опять же, я бы использовал массив, чтобы потом его можно было легко использовать:
$ curl "${VARNAME[@]}"