從 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"

相關內容