如何在 Bash 中扩展数组,为元素添加双引号?

How to expand array in Bash adding double quotes to elements?

我想将数组传递给函数并将数组中的值用作命令参数,如下所示:

command可以接收N个参数,例子:param1 param2 oneparam 1 a 2 b 3 c onotherparam

my_func() {
    command param1 param2   
}

my_arr=("1 a" "2 b" "3 c")

my_func "oneparam" ${my_arr[@]} "onotherparam"

但我并没有将其全部作为函数中的单个参数接收,因此 </code> 只是 <code>1 a 而不是 "1 a" "2 b" "3 c"

那么我虽然可以这样做:

my_func() {
    command param1 param2   
}

my_arr=("1 a" "2 b" "3 c")
params=${my_arr[@]/%/\"}  # 1 a" 2 b" 3 c"

my_func "oneparam" "$params" "onotherparam"

但它只将引号放在每个元素的末尾。

如何在每个数组元素的两边加上引号?

要使用正确的引用保留参数,您必须进行两项更改:引用数组扩展并使用函数中的所有参数,而不仅仅是 </code>.</p> <pre><code>my_func() { command par1 par2 "$@" } my_arr=("1 a" "2 b" "3 c") my_func "${my_arr[@]}"

如果 OP 真的想在 3 个数组元素周围维护一组双引号,那么一个想法是在填充数组时显式添加它们,例如:

my_arr=('"1 a"' '"2 b"' '"3 c"')

使用稍微修改过的 OPs 函数定义:

my_func() {
    echo command param1 param2   
}

并开启调试:

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"