使用命令列參數尋找帶有符號的檔案時出現意外結果

使用命令列參數尋找帶有符號的檔案時出現意外結果

我正在嘗試編寫一個接受 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 問題,並建議您編輯問題以解釋您真正想要做什麼。

相關內容