从 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:  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、搜索QUOTINGHISTORY EXPANSION了解完整详细信息。

答案2

一般来说,你不必逃避 引用任何事物。编写此代码的安全方法是:

FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"

相关内容