2017-01-10 139 views
0

我寫了一個bash腳本,它通過名稱接受參數並在鍵值對中讀取其值。以下是我如何運行腳本的示例。爲bash腳本解析輸入參數時帶空格的參數

sh test.sh param1='a' param2='b' 

然後我在腳本內引用輸入參數,如$ param1和$ param2。以下是我爲此撰寫的腳本。

for item in [email protected]; do 
case $item in 
(*=*) eval $item;; 
esac 
done 

但是,當參數的值有空格時,它只佔用空格之前的部分。

param3='select * from' 

只會將「select」分配給param3而不是整個字符串。我怎樣才能做到這一點?任何幫助將非常感激。

編輯:

Inian的回答後

for item in [email protected]; do 
case "$item" in 
(*=*) eval "$item";; 
esac 
done 
+1

你有沒有考慮過將它們作爲變量傳遞給它,而不是'param1 ='a'param2 ='b'sh test.sh'?這將使'echo'$ param1「'立即可用而不解析 –

+1

使用$ @或$ *而不用雙引號括起來不是一個好主意。如果你的字符串中有特殊字符,比如空白字符和通配符,它​​會變得不合時宜。 – codeforester

回答

3

您可以通過引用"[email protected]"和使用declare代替eval做到這一點:

for item in "[email protected]"; do 
case $item in 
(*=*) declare "$item" ;; 
esac 
done 

但是,現在這是一個bash腳本,所以你必須運行它與bash test.sh而不是sh test.sh

+0

這個伎倆!但正如你在評論中指出的那樣,在「sh 」之後和「sh 」之前指定參數之間的區別是什麼?對不起,我是新手。 – mayooran

+0

@mayooran:如果你在命令之前指定它們,作爲環境變量*由調用shell *進行分配*,所以它們可以直接在腳本中使用,如果你把它們放在後面,它們會被解釋爲字符串以'$ 1','$ 2'等形式傳遞給腳本,那麼你必須做一些非標準和奇怪的事情來將它們轉化爲變量賦值,腳本接受參數的正常方式是以標準順序(例如'sh test.sh val1 val2')的裸空字符串,或者使用'-'選項來指定它們(例如'sh test.st -a val1 -b val2')。 –

+0

@GordonDavisson哦,知道了,謝謝!:) :) – mayooran