Как расширить массив в Bash, добавив двойные кавычки к элементам?

#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"