2012-07-26 47 views
3

我正在編寫一個shell腳本,其中參數將成爲某個位置的路徑。我正在使用readlink -f命令獲取用戶發送路徑的絕對路徑。假設如果用戶發送的路徑具有類似的空間,readlink -f空格

/home/stack over flow/location 

我以外的用戶與報價發送類似

"/home/stack over flow/location" 

我這裏有2個問題,

1)即使如果路徑通過引號傳遞,當我遍歷$ @時,引號被抑制並且獲取不帶引號的路徑。

2)我做了周圍的工作,以檢查是否參數包含空格,然後加明確像

if [[ $1 = *\ * ]] ; then 
      temp=\"$1\" 
    fi 

,我加引號「明確,但現在我面臨的問題是,即使我添加變量用空格現在的readlink不工作 當我做

full_path=`readlink -f ${temp}` 

它說 用法:執行的readlink [-n] [-f]符號鏈接

如果我在shell中執行它作爲一個正常的unix命令一樣

 readlink -f "/home/stack over flow/location" 

這是工作,我得到完整路徑。爲什麼即使我追加空格readlink在shell腳本中也不起作用?這個你能幫我嗎。

+1

做這項工作'readlink -f「$ *」'? – perreal 2012-07-26 07:43:26

+1

使它成爲'full_path = $(readlink -f「$ temp」)''。請注意雙引號。 – fork0 2012-07-26 07:48:21

回答

5

那麼它是有道理的,你在腳本參數中得到沒有引號的路徑:引號是用於處理腳本的調用的shell,而不是腳本本身。 我想你所說的命令是這樣的:

./test "/home/stack over flow/location" 

其中「測試」是你實現腳本。路徑周圍的引號確保執行此命令的shell將路徑視爲單個參數,而不是三個單獨的字符串,因爲它不包含引號。但是引號不會被視爲參數本身的一部分。所以當參數交給你的腳本時,你會得到一個保存整個路徑的單個參數,而不是一個保存基於路徑的修改過的字符串的參數:帶有填充引號的字符串。

您可以毫無問題地使用該參數。只需再次引用它:

readlink -f "[email protected]" 

將保護包含在指定路徑中的空白,就像在原始調用中一樣。

+1

如果不是腳本的所有參數都是用於'readlink'的,他應該怎麼做?此外,readlink只接受一個文件參數 – fork0 2012-07-26 08:16:54

+0

@ fok0:是的,你是正確的。在將它傳遞給readlink之前,我必須進行額外的檢查。 – Mojoy 2012-07-26 11:18:20