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!

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.