2013-12-19 25 views
0

我正在編寫一個捲曲bash腳本來測試webservices。我會file_1這將包含之間{}是動態的,我創建一個單獨的文件,該文件將對這些PARAMS值的URL路徑無論bash版本如何,Bash腳本鍵/值對

/path/to/url/1/{dynamic_path}.xml 
/path/to/url/2/list.xml?{query_param} 

由於值。輸入將是鍵值對,即

dynamic_path=123 
query_param=shipment 

通過結合兩個文件,輸入應該成爲

/path/to/url/1/123.xml 
/path/to/url/2/list.xml?shipment 

這是我的問題的背景。現在我的問題

我正在做bash腳本,並且我使用的方法是首先讀取帶有參數的文件,並根據'='解析它並將其存儲在鍵/值對中。所以它很容易替換,即對於每個URL我都會找到{}和它附帶的任何文本之間的子字符串,我將用它作爲從數組中獲取值的鍵

我的方法聽起來不錯(至少對我來說)但是,我剛剛意識到

declare -A input_map只在高於4.0的bashscript中受支持。現在,我不能100%確定腳本的目標環境是什麼,因爲它可以在多個部門中運行。

有什麼更好的建議嗎?任何其他方法?任何其他設計?

P.S: 這是我第一次使用bash腳本。

回答

3

這裏做一個有風險的方式:假設值是在一個文件名爲「值」

. values 
eval "$(sed 's/^/echo "/; s/{/${/; s/$/"/' file_1)" 

基本上,堅持一個美元符號的大括號前和改造各行成一個echo語句。

更多努力,已與AWK:

awk ' 
    NR==FNR {split($0, a, /=/); v[a[1]]=a[2]; next} 
    (i=index($0, "{")) && (j=index($0,"}")) { 
     key=substr($0,i+1, j-i-1) 
     print substr($0, 1, i-1) v[key] substr($0, j+1) 
    } 
' values file_1 
+0

+1。我也打算髮布這種冒險的做法,但後來不再認爲這太冒險了。 – anubhava

+0

它有什麼風險?有人可以分解它嗎? –

+1

想象一下在file_1中增加了一行:'/ path/to/$(echo這是一個惡意命令)' –

0

有很多方法可以做到這一點。您似乎認爲將所有輸入放入散列映射中,然後遍歷該散列映射。在shell腳本中,使用管道將事情處理爲流是更常見和實用的。

例如,您輸入的可能是一個CSV文件:

123,shipment 
345,order 

然後,你可以處理這個文件是這樣的:

while IFS=, read path param; do 
    sed -e "s/{dynamic_path}/$path/" -e "s/{query_param}/$param/" file_1 
done < input.csv 

輸出將是:

/path/to/url/1/123.xml 
/path/to/url/2/list.xml?shipment 
/path/to/url/1/345.xml 
/path/to/url/2/list.xml?order 

但這只是一個例子,可以有很多其他的方式。

您應該首先編寫概念驗證並在您的部署服務器上測試它。這個例子也應該在老版本的bash中工作。

+0

的問題是,假定CSV的第一行是123,裝運然而,file_1的第一行是'/路徑/到/ URL/2 /列表。 XML?{query_param}'。如果我嘗試在URL中找到路徑,我永遠不會找到它。我必須確保一切順利。 –

+0

@EEMe我不確定我是否理解你的問題。我將循環中的'echo'改爲'sed'並添加了一個樣本輸出。用於awk命令的 – janos