代码之家  ›  专栏  ›  技术社区  ›  bibermann

从包含双引号的数组展开参数

  •  4
  • bibermann  · 技术社区  · 7 年前

    我想调用一个程序 从数组生成的参数 在bash中。

    echo -arg1=simple -arg2="some spaces"
    

    从…起 array=(echo -arg1=simple "-arg2=\"some spaces\"")

    问题

    "${array[@]}" bash调用:

    echo -arg1=simple '-arg2="some spaces"'
    

    示例代码

    #!/bin/bash
    set -x
    
    array=()
    array+=(echo)
    array+=(-arg1=simple)
    array+=("-arg2=\"some spaces\"")
    
    "${array[@]}"
    "${array[*]}"
    ${array[@]}
    ${array[*]}
    

    echo -arg1=simple '-arg2="some spaces"'
    'echo -arg1=simple -arg2="some spaces"'
    echo -arg1=simple '-arg2="some' 'spaces"'
    echo -arg1=simple '-arg2="some' 'spaces"'
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   chepner    7 年前

    "${array[@]}" -x '-arg2="some spaces"' 相当于 "-arg2=\"some spaces\""

        2
  •  3
  •   randomir    7 年前

    你可以简单地这样做,不需要保留 echo 阵列内部:

    #!/bin/bash -x
    
    array=()
    array+=(-arg1=simple)
    array+=(-arg2="some spaces")
    
    echo "${array[@]}"
    

    这将导致调用 回响 -arg1=simple -arg2="some spaces" ,就好像你写道:

    echo -arg1=simple -arg2="some spaces"
    

    或者,您可以在一行中定义数组,使用 declare

    declare -a array=(-arg1=simple -arg2="some spaces")
    

    要检查它将如何扩展,您可以使用 printf == 这里只是为了清楚地显示每个论点的开始和结束):

    $ printf "==%s==\n" "${array[@]}"
    ==-arg1=simple==
    ==-arg2=some spaces==
    

    注意引号的重要性 ${array[@]}

    $ printf "==%s==\n" ${array[@]}
    ==-arg1=simple==
    ==-arg2=some==
    ==spaces==
    

    使现代化 如果你想把它扩展到

    $ declare -a array=(-arg1=simple '-arg2="some spaces"')
    $ echo "${array[@]}"
    -arg1=simple -arg2="some spaces"
    $ printf "==%s==\n" "${array[@]}"
    ==-arg1=simple==
    ==-arg2="some spaces"==