【问题标题】:How to expand array in Bash adding double quotes to elements?如何在 Bash 中扩展数组,为元素添加双引号?
【发布时间】:2021-02-20 20:09:15
【问题描述】:

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

command可以接收N个参数,例如:param1param2oneparam1 a2 b3 conotherparam

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"

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

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

【问题讨论】:

  • 应该command得到三个参数,par1par2,和1 a 2 b 3 c,还是5,如par1par21 a2 b3 c?
  • @BenjaminW。一共是5个参数。
  • 目前尚不清楚您要在这里做什么。访问 shellcheck.net 会发现许多引用问题。但是您的功能并不清楚您是否期望 my_arr 的所有元素或仅其中一个元素。如所写,您只会得到一个单词拆分参数。
  • par1par2 是什么?

标签: linux bash function shell variable-substitution


【解决方案1】:

要使用正确的引用来保留参数,您必须进行两项更改:引用数组扩展并使用函数中的所有参数,而不仅仅是$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"
    

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多