-2

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

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"

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

如何在每个数组元素的两侧放置引号?

4

2 回答 2

1

要使用正确的引用保留参数,您必须进行两项更改:引用数组扩展并使用函数中的所有参数而不是仅使用$1.

my_func() {
    command par1 par2 "$@"
}

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

my_func "${my_arr[@]}"
于 2020-11-08T20:31:08.123 回答
0

如果 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"
于 2020-11-08T20:46:19.050 回答