Estou escrevendo um script que executa vários programas com argumentos. Para simplificá-lo tanto quanto possível, considere o seguinte exemplo:
programs=( "ls" "echo" )
declare -A parameters
parameters["ls"]="-l /tmp/foo"
parameters["echo"]="Hello"
for program in "${programs[@]}"
do
$program ${parameters[$program]}
done
Isso funciona bem, desde que não haja espaços nos argumentos. É claro que escape de strings foi discutido antes, então tentei todas as maneiras diferentes que encontrei aqui no StackExchange e em algumas outras páginas. No entanto, não consegui encontrar uma solução que funciona no meu caso, que usa matrizes associativas. Por exemplo, quando eu quero obter uma listagem de "/ tmp / foo bar", nem isso
parameters["ls"]="-l /tmp/foo bar"
nem isso
parameters["ls"]="-l \"/tmp/foo bar\""
nem isso
parameters["ls"]="-l /tmp/foo\ bar"
funciona como esperado. Da mesma forma, colocar aspas ao redor da chamada do programa no loop
$program "${parameters[$program]}"
também não funciona, pois os dois parâmetros (-l e o caminho) são interpretados como um parâmetro.
Encontrei o mais parecido com uma solução em este post que propõe o uso de múltiplas variáveis separadas, uma para cada argumento, para a chamada do programa. Isso, no entanto, não é possível no meu caso de uso, o que requer um número variável de argumentos para cada programa - assim, meu uso do array associativo.
Existe alguma outra maneira de escapar do nome do caminho?
Atenciosamente
Andreas