Я пытаюсь создать простой скрипт, который распаковывает zip-файл, в имени которого есть восклицательный знак:
#!/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
но при выполнении скрипта unzip возвращает:
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.
Это работает нормально, когда в имени файла нет знака «!», но чтобы автоматизировать часть работы, мне нужно оставить оригинальные имена файлов.
решение1
!
является символом расширения истории команд, поэтому его необходимо заключать в кавычки в командной строке, когда включено расширение истории. Его не нужно заключать в кавычки внутри скрипта.
Из страницы руководства:
При использовании возможностей расширения истории команд (см. РАСШИРЕНИЕ ИСТОРИИ ниже) символ расширения истории, обычно !, необходимо заключать в кавычки, чтобы предотвратить расширение истории.
и
Неинтерактивные оболочки по умолчанию не выполняют расширение истории.
см. man bash
, ищите QUOTING
и HISTORY EXPANSION
для получения полной информации.
решение2
В общем, вам не нужно бежать.и цитироватьчто угодно. Безопасный способ записать это будет:
FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"