Escapando strings em matrizes associativas (bash)

5

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

    
por Andreas Unterweger 13.01.2015 / 15:06

1 resposta

1

Primeiro, crie um array com os parâmetros.

Em seguida, armazene o valor da string do array (encontrado com declare -p ) em parameters e recupere-o e use-o como um array real mais tarde, como em:

#!/bin/bash

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

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

parameters["echo"]="Hello"

for program in "${programs[@]}";do
    echo "PROGRAM: $program"
    declare -a arrayTmp="${parameters[$program]}"
    $program "${arrayTmp[@]}"
    arrayTmp=()
done
    
por 27.04.2015 / 03:24