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

1

Estou tentando fazer um script simples que descompacte um arquivo zip que tenha um ponto de exclamação em seu 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, o 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 com o nome do arquivo, mas para automatizar alguns dos meus trabalhos, eu preciso ficar com nomes de arquivos originais.

    
por Marcin Bobowski 02.11.2015 / 22:17

2 respostas

1

Em geral, você não precisa escapar e citar . 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"
    
por 02.11.2015 / 22:41
2

! é o caractere de expansão de histórico do comando, portanto, precisa ser citado na linha de comandos quando a expansão do histórico estiver ativada. Não precisa ser citado dentro de um script.

Da página do manual:

When the command history expansion facilities are being used (see HISTORY EXPANSION below), the history expansion character, usually !, must be quoted to prevent history expansion.

e

Non-interactive shells do not perform history expansion by default.

veja man bash , procure por QUOTING e HISTORY EXPANSION para detalhes completos.

    
por 02.11.2015 / 22:41