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"
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.
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"
!
é 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.
Tags bash shell-script osx