Expandir variáveis bash introduzidas a partir do comando read

0

Eu tenho um arquivo delimitado por tabulações como este:

table_a    "where id IN ($IDS)"
table_b    "where fk_id IN ($IDS)"
table_c    "where fk_id IN ($SOME_OTHER_IDS)"

Estou tentando escrever um script como:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"
done < 'myfile.txt'

O problema é que, é claro, $IDS não é expandido / interpretado quando é lido do comando read .

Parece que posso fazer algo como:

WHERECLAUSE='eval echo "$WHERECLAUSE"'

Mas é inerentemente inseguro usar o eval dessa maneira?

Existe uma maneira melhor de substituir $IDS que evita usar eval de maneira insegura? De preferência, estou procurando uma solução que suporte tanto o OSX quanto o Ubuntu.

Obrigado!

    
por Code Commander 20.02.2014 / 02:38

1 resposta

1

eval deve definitivamente ser sua última opção e, particularmente, se o arquivo de entrada for uma entrada do usuário.

Para casos simples (ou seja, onde você não precisa se preocupar com caracteres de escape e citações), é possível fazer o seguinte:

IDS="1,2,3"
SOME_OTHER_IDS="4,5,6"

while read TABLE WHERECLAUSE
do
    WHERECLAUSE=${WHERECLAUSE//\$IDS/$IDS}
    WHERECLAUSE=${WHERECLAUSE//\$SOME_OTHER_IDS/$SOME_OTHER_IDS}
    echo "$WHERECLAUSE"
    mysqldump ... --where="$WHERECLAUSE"   
done

Infelizmente, você precisa repetir a pesquisa e substituição para cada nome de variável possível, mas, no lado positivo, isso significa que você controla quais nomes de variáveis podem ser substituídos.

    
por 20.02.2014 / 06:40