Распаковка файла с восклицательным знаком из командной строки в скрипте bash

Распаковка файла с восклицательным знаком из командной строки в скрипте bash

Я пытаюсь создать простой скрипт, который распаковывает 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"

Связанный контент