Descompactando arquivo com ponto de exclamação da linha de comando no script bash

Descompactando arquivo com ponto de exclamação da linha de comando no script bash

Estou tentando fazer um script simples que descompacte um arquivo zip que possui um ponto de exclamação no nome:

#!/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

mas quando o script está sendo executado, unzip retorna:

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 bem quando não há "!" entre no nome do arquivo, mas para automatizar parte do meu trabalho, preciso manter os nomes dos arquivos originais.

Responder1

!é o caractere de expansão do histórico de comando, portanto precisa ser colocado entre aspas na linha de comando quando a expansão do histórico está habilitada. Não precisa ser citado dentro de um script.

Na página de manual:

Quando os recursos de expansão do histórico de comando estão sendo usados ​​(veja HISTORY EXPANSION abaixo), o caractere de expansão do histórico, geralmente !, deve ser colocado entre aspas para evitar a expansão do histórico.

e

Os shells não interativos não executam a expansão do histórico por padrão.

veja man bash, pesquise QUOTINGe HISTORY EXPANSIONobtenha detalhes completos.

Responder2

Em geral você não precisa escapare citarqualquer coisa. A maneira segura de escrever isso seria:

FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"

informação relacionada