我正在嘗試編寫一個簡單的腳本來解壓縮名稱中帶有感嘆號的 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"