2016-01-22 76 views
0

我正試圖解析發送給shell腳本的參數。例如發送到腳本值如下:在shell腳本中用引號解析參數

-to [email protected] -a file1.txt file2.txt "new file.txt" 

我可以解析字符串,使我得到-a我的運營商,但我想重新格式化參數部分file1.txt file2.txt "new file.txt",使它看起來像'file1.txt' 'file2.txt' 'new file.txt'使我可以將它傳遞給zip實用程序。

現在我用下面的分析參數,但它沒有讓我我想要的結果。它接近但不完全正確。

for file in `echo $PARM` 
do 
    FILE_LIST="$FILE_LIST '"$file"'" 
done 

這給了我'file1.txt' file2.txt' 'new' 'file.txt'我怎麼能返工上面的代碼給我我想要的東西。 謝謝

+1

zip?顯示完整的示例。 http://xyproblem.info/ –

+2

請說明你如何賦值給PARM。 –

+2

這不是傳遞文件名到'zip'的好起點。單引號是shell語法,不能將字符串中的字面值傳遞給zip。改用數組。 –

回答

1

首先,你需要了解操作的順序時,殼解析命令行。下面是一個部分列表:首先,它解釋引號和轉義,然後刪除它們(在它們產生效果之後),然後展開任何變量引用(以及類似的東西,如反引號表達式),單詞拆分和通配符 - 展開展開的變量值,然後最終將所有這些結果視爲命令及其參數。

這對你想做什麼兩個重要的意義:通過你的腳本接收其論點的時候,就不再有報價;引號有其效果(new file.txt是一個單一的參數而不是兩個),但引號本身已經消失。另外,當把變量放在變量中是無用的,因爲當變量被擴展並且引號是命令行的一部分時,他們做任何有用的事情爲時已晚 - 它們不被解析爲引號,它們是隻是作爲參數的一部分傳遞給命令(其中不需要)。

幸運的是,答案很簡單(和斯蒂芬·P總結在他的評論):把周圍的所有變量引用雙引號。這可以防止分詞和通配符擴展階段與其值相混淆,這意味着無論作爲單個參數傳遞給您的腳本(例如new file.txt)都會作爲單個參數傳遞。如果您需要傳遞所有參數,請使用"[email protected]"。如果您只需要傳遞一些信息,則可以使用shift來清除選項,然後"[email protected]"將傳遞其餘的信息,或者使用例如"[email protected]""${@:4}"傳遞從#4開始的所有參數或"${@:4:3}"傳遞從#4開始的三個參數。