![转义关联数组中的字符串 (bash)](https://linux22.com/image/60618/%E8%BD%AC%E4%B9%89%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%20(bash).png)
我正在编写一个脚本,它执行许多带有参数的程序。为了尽可能简化,请考虑以下示例:
programs=( "ls" "echo" )
declare -A parameters
parameters["ls"]="-l /tmp/foo"
parameters["echo"]="Hello"
for program in "${programs[@]}"
do
$program ${parameters[$program]}
done
只要参数中没有空格,这种方法就可以正常工作。当然,之前已经讨论过转义字符串,因此我尝试了在 StackExchange 和其他一些页面上可以找到的所有不同方法。但是,我找不到适用于我使用关联数组的情况的解决方案。例如,当我想获取“/tmp/foo bar”的列表时,这两个都不是
parameters["ls"]="-l /tmp/foo bar"
也不是这个
parameters["ls"]="-l \"/tmp/foo bar\""
也不是这个
parameters["ls"]="-l /tmp/foo\ bar"
按预期工作。同样,在循环中的程序调用周围加上引号
$program "${parameters[$program]}"
也不起作用,因为两个参数(-l 和路径)被解释为一个参数。
我找到了最接近解决方案的东西这个帖子它建议在程序调用中使用多个单独的变量,每个参数一个。然而,在我的用例中这是不可能的,因为每个程序都需要可变数量的参数 - 因此我使用关联数组。
还有其他方法可以转义路径名吗?
最好的问候安德烈亚斯
答案1
首先,使用参数创建一个数组。
然后,将数组字符串值(通过 找到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