variable script example bash scripting expansion

script - bash variable substitution



¿Cómo hacer bash expandir comodines en variables? (3)

Necesitarás evaluar esa línea para que funcione, así:

MYDIR="./images" OTHERDIR="./images/junk" SUFFIXES=''{pdf,eps,jpg,svg}'' eval "mv /"$MYDIR/"/*.$SUFFIXES /"$OTHERDIR//""

Ahora, esto tiene problemas, en particular, si no confías en $SUFFIXES , podría contener un ataque de inyección, pero para este simple caso debería estar bien

Si está abierto a otras soluciones, es posible que desee experimentar con find y xargs .

Estoy tratando de lograr el mismo efecto que escribiendo

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/

en la línea de comandos, desde dentro de un script bash. Yo tengo:

MYDIR="./images" OTHERDIR="./images/junk" SUFFIXES=''{pdf,eps,jpg,svg}'' mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

que, cuando se ejecuta, da el error no inesperado:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: No such file or directory

¿Cuál es la forma correcta de citar todo esto para que mv realice la expansión deseada? (Sí, hay muchos archivos que coinciden con el patrón en ./images/ .)


Puedes escribir una función:

function expand { for arg in "$@"; do [[ -f $arg ]] && echo $arg; done }

Entonces llámalo con lo que quieras expandir:

expand "$MYDIR/"*.$SUFFIXES

También puede hacer que sea un script expand.sh si lo desea.


Una respuesta eliminada estaba en el camino correcto. Una ligera modificación a su intento:

shopt -s extglob MYDIR="./images" OTHERDIR="./images/junk" SUFFIXES=''@(pdf|eps|jpg|svg)'' mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

La expansión de refuerzo se realiza antes de la expansión de la variable, pero la expansión de la variable se realiza antes de la expansión de la ruta de acceso. Por lo tanto, las llaves siguen siendo llaves cuando la variable se expande en su original, pero cuando la variable en su lugar contiene elementos de ruta de acceso, ya se han expandido cuando se realiza la expansión de la ruta de acceso.