Descomprimir archivo con signo de exclamación desde la línea de comando en script bash

Descomprimir archivo con signo de exclamación desde la línea de comando en script bash

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 QUOTINGy HISTORY EXPANSIONpara 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"

información relacionada