![使用命令列參數尋找帶有符號的檔案時出現意外結果](https://rvso.com/image/57395/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E5%88%97%E5%8F%83%E6%95%B8%E5%B0%8B%E6%89%BE%E5%B8%B6%E6%9C%89%E7%AC%A6%E8%99%9F%E7%9A%84%E6%AA%94%E6%A1%88%E6%99%82%E5%87%BA%E7%8F%BE%E6%84%8F%E5%A4%96%E7%B5%90%E6%9E%9C.png)
我正在嘗試編寫一個接受 2 個命令列參數的腳本,例如一個是目錄名稱,另一個是符號(任何符號可以是 $、£、^、* 等)。然後,它應該檢查目錄中是否有包含該符號的檔案名,以及是否未將該符號新增至目錄。
因此,如果我查找名為testDir
第一個參數的目錄並使用 a*
作為第二個參數,它將檢查該目錄中的檔案以查看檔案中是否存在該符號,如果不存在,則該目錄現在將被稱為為testDir*
。
這是我正在嘗試開發的一些程式碼。
a1=$1
symbol=$(ls $a1 | grep $2)
if [ "$symbol" != "" ]
then
echo "file has Symbol"
else
echo "The symbol was added to directory"
mv $a1 $1$2
fi
它似乎與@
符號一起工作正常,所以我相信它受到特殊字元的影響。有什麼方法可以嘗試轉義特殊字符,但也可以使用非特殊字符?
答案1
首先,它是從來都不是一個好主意ls
解析查找檔案名稱時的輸出。這將破壞任何奇怪的字符,包括簡單的空格。最好的方法是使用shell 通配符或者find
相反。
您的下一個問題是您沒有引用變量,這意味著在mv
運行命令之前會擴展特殊字元。您的腳本的一個工作範例是:
#!/usr/bin/env bash
if find "$1" -print0 | grep -z "$2" >/dev/null
then
echo "file has Symbol"
else
echo "The symbol was added to directory"
echo mv "$1" "$1$2"
fi
警告: 我不知道你為什麼要這樣做。它會。例如,嘗試將目錄移至其自身的子目錄中,這將失敗。我懷疑這裡有 XY 問題,並建議您編輯問題以解釋您真正想要做什麼。