我正在尝试编写一个简单的脚本来解压缩名称中带有感叹号的 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: 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
!
是命令历史扩展字符,因此当启用历史扩展时需要在命令行上加引号。不需要在脚本内引用它。
从手册页:
当使用命令历史扩展功能时(请参阅下面的 HISTORY EXPANSION),必须引用历史扩展字符(通常为 !)以防止历史扩展。
和
默认情况下,非交互式 shell 不执行历史记录扩展。
请参阅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"