Estoy intentando hacer un script simple que descomprime un archivo zip que tiene un signo de exclamación en su nombre:
#!/bin/bash
UNZIP='/usr/bin/unzip'
CUT="/usr/bin/cut"
GREP="/usr/bin/grep"
FILENAME="test"
FILE="/usr/local/var/www/htdocs/"$FILENAME"\!3.zip"
UNZIPPEDFOLDER=$($UNZIP ${FILE} | $GREP -m1 'creating:' | $CUT -d' ' -f5-)
echo $UNZIPPEDFOLDER
pero cuando se ejecuta el script, descomprimir devuelve:
unzip: cannot find or open /usr/local/var/www/htdocs/test\!3.zip, /usr/local/var/www/htdocs/test\!3.zip.zip or /usr/local/var/www/htdocs/test\!3.zip.ZIP.
Funciona bien cuando no hay "!" inicie sesión con el nombre del archivo, pero para automatizar parte de mi trabajo, necesito permanecer con los nombres de archivo originales.
Respuesta1
!
es el carácter de expansión del historial de comandos, por lo que debe citarse en la línea de comandos cuando la expansión del historial está habilitada. No es necesario citarlo dentro de un guión.
Desde la página de manual:
Cuando se utilizan las funciones de expansión del historial de comandos (consulte EXPANSIÓN DEL HISTORIAL a continuación), se debe citar el carácter de expansión del historial, generalmente !, para evitar la expansión del historial.
y
Los shells no interactivos no realizan la expansión del historial de forma predeterminada.
ver man bash
, buscar QUOTING
y HISTORY EXPANSION
para obtener todos los detalles.
Respuesta2
En general no tienes que escapar.y citacualquier cosa. La forma segura de escribir esto sería:
FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"