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 和路径)被解释为一个参数。
我在这篇文章中找到了最接近解决方案的方法,它建议为程序调用使用多个单独的变量,每个参数一个变量。但是,这在我的用例中是不可能的,因为每个程序需要可变数量的参数 - 因此我使用了关联数组。
有没有其他方法可以转义路径名?
最好的问候安德烈亚斯
首先,使用参数创建一个数组。
然后,将数组字符串值(通过 找到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)