#linux #bash #function #shell #variable-substitution
#linux #bash #функция #оболочка #переменная-подстановка
Вопрос:
Я хотел бы передать массив в функцию и использовать значения в массиве в качестве командного параметра, что-то вроде этого:
command
можно получить N параметров, например: param1
param2
oneparam
1 a
2 b
3 c
onotherparam
my_func() {
command param1 param2 $1 $2 $3
}
my_arr=("1 a" "2 b" "3 c")
my_func "oneparam" ${my_arr[@]} "onotherparam"
Но я не получаю все это как один параметр в функции, поэтому $1
только 1 a
вместо "1 a" "2 b" "3 c"
Тогда я подумал, что могу это сделать:
my_func() {
command param1 param2 $1 $2 $3
}
my_arr=("1 a" "2 b" "3 c")
params=${my_arr[@]/%/"} # 1 a" 2 b" 3 c"
my_func "oneparam" "$params" "onotherparam"
Но он помещает кавычки только в конец каждого элемента.
Как я могу поместить кавычки с обеих сторон каждого элемента массива?
Комментарии:
1. Должно
command
быть три параметра,par1
,par2
, и1 a 2 b 3 c
, или 5, как вpar1
,par2
,1 a
,2 b
,3 c
?2. @BenjaminW. Всего 5 параметров.
3. Неясно, что вы пытаетесь здесь сделать. Посещение shellcheck. net укажет на многочисленные проблемы с цитированием. Но ваша функция неясна, ожидаете ли вы все элементы
my_arr
или только один из них. Как написано, вы получите только один аргумент разделения слов.4. Что такое
par1
иpar2
?
Ответ №1:
Чтобы сохранить параметры с правильными кавычками, вам нужно внести два изменения: заключить расширение массива в кавычки и использовать все параметры в функции вместо just $1
.
my_func() {
command par1 par2 "$@"
}
my_arr=("1 a" "2 b" "3 c")
my_func "${my_arr[@]}"
Ответ №2:
Если OP действительно хочет сохранить набор двойных кавычек вокруг 3 элементов массива, то одной из идей было бы явно добавить их при заполнении массива, например:
my_arr=('"1 a"' '"2 b"' '"3 c"')
Использование слегка измененного определения функции OPs:
my_func() {
echo command param1 param2 $1 $2 $3
}
И включение отладки:
set -xv
При вызове функции мы видим следующее (обратите внимание на вызовы с кавычками и без кавычек вокруг ссылки на массив):
$ my_func ${my_arr[@]}
my_func ${my_arr[@]}
my_func '"1' 'a"' '"2' 'b"' '"3' 'c"'
echo param1 param2 '"1' 'a"' '"2'
param1 param2 "1 a" "2
# and
$ my_func "${my_arr[@]}"
my_func "${my_arr[@]}"
my_func '"1 a"' '"2 b"' '"3 c"'
echo param1 param2 '"1' 'a"' '"2' 'b"' '"3' 'c"'
param1 param2 "1 a" "2 b" "3 c"