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 QUOTING
e HISTORY EXPANSION
obtenha 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"