Expandir las variables bash ingresadas desde el comando de lectura

0

Tengo un archivo delimitado por tabulaciones como este:

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

Y estoy tratando de escribir un guión como:

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

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

El problema es que, por supuesto, $IDSno se expande / interpreta cuando se lee desde el readcomando.

Parece que puedo hacer algo en el bucle como:

WHERECLAUSE=`eval echo "$WHERECLAUSE"`

¿Pero es inherentemente inseguro usar eval de esa manera?

¿Hay una mejor manera de reemplazar $IDSque evite el uso evalde una manera insegura? Preferiblemente estoy buscando una solución que sea compatible con OSX y Ubuntu.

¡Gracias!

Code Commander
fuente

Respuestas:

1

eval Definitivamente debería ser su última opción, y particularmente si el archivo de entrada es entrada del usuario.

Para casos simples (es decir, donde no necesita preocuparse por los caracteres de escape y las citas), puede hacer lo siguiente:

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

Desafortunadamente, debe repetir la búsqueda y reemplazo de cada nombre de variable posible, pero en el lado positivo, eso significa que usted controla qué nombres de variables se pueden sustituir.

rici
fuente