转义关联数组中的字符串 (bash)

And*_*ger 6 bash string escape-characters

我正在编写一个脚本,该脚本执行多个带参数的程序。为了尽可能地简化它,请考虑以下示例:

programs=( "ls" "echo" )
declare -A parameters
parameters["ls"]="-l /tmp/foo"
parameters["echo"]="Hello"

for program in "${programs[@]}"
do
  $program ${parameters[$program]}
done
Run Code Online (Sandbox Code Playgroud)

只要参数中没有空格,这就可以正常工作。当然,转义字符串之前已经讨论过,所以我尝试了在 StackExchange 和其他一些页面上可以找到的所有不同方法。但是,我找不到适用于我的使用关联数组的解决方案。例如,当我想获得“/tmp/foo bar”的列表时,这既不是

parameters["ls"]="-l /tmp/foo bar"
Run Code Online (Sandbox Code Playgroud)

也不是这个

parameters["ls"]="-l \"/tmp/foo bar\""
Run Code Online (Sandbox Code Playgroud)

也不是这个

parameters["ls"]="-l /tmp/foo\ bar"
Run Code Online (Sandbox Code Playgroud)

按预期工作。同样,在循环中的程序调用周围加上引号

  $program "${parameters[$program]}"
Run Code Online (Sandbox Code Playgroud)

也不起作用,因为两个参数(-l 和路径)被解释为一个参数。

我在这篇文章中找到了最接近解决方案的方法,它建议为程序调用使用多个单独的变量,每个参数一个变量。但是,这在我的用例中是不可能的,因为每个程序需要可变数量的参数 - 因此我使用了关联数组。

有没有其他方法可以转义路径名?

最好的问候安德烈亚斯

Aqu*_*wer 2

首先,使用参数创建一个数组。

然后,将数组字符串值(通过 找到declare -p)存储在 处parameters,然后恢复并将其用作实际数组,如下所示:

#!/bin/bash

programs=( "ls" "echo" )
declare -A parameters

arrayTmp=("-l" "/tmp/foo bar")
parameters["ls"]="`declare -p arrayTmp |sed -r "s,[^=]*='(.*)'$,\1,"`"

parameters["echo"]="Hello"

for program in "${programs[@]}";do
    echo "PROGRAM: $program"
    declare -a arrayTmp="${parameters[$program]}"
    $program "${arrayTmp[@]}"
    arrayTmp=()
done
Run Code Online (Sandbox Code Playgroud)