2017-01-30 84 views
1

有一些類似的主題,但是略有不同。在執行的腳本內部執行awk輸出


我有數據庫的腳本和參數名稱a。當我執行:

sqlite3 log/log.db "select name, a from result" | awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}' 

我看到:

a[inc.bash]=4.23198234894777e-06; 
a[inc.c]=3.53343440279423e-10; 

在我的bash腳本我想用一個關聯數組。


當我執行這個代碼(由a[inc.bash]手值編碼):

declare -A a 
a[inc.bash]=4.23198234894777e-06; 
echo ${a[inc.bash]} 

它正常工作和打印

4.23198234894777e-06 

但我不知道,怎麼使用awk的第一個顯示命令的輸出分配關聯數組a的鍵的值我的腳本。

我想執行由AWK打印我的腳本里面的代碼,但是當我使用類似$()``,它打印這樣的錯誤:

代碼:

declare -A a 
$(sqlite3 log/log.db "select name, a from result" | awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}') 
echo ${a[inc.bash]} 

輸出:

a[inc.bash]=4.23198234894777e-06; not found command 

回答

3

告訴bash解釋爲命令你的輸出,你可以使用進程替換和source命令:

declare -A a 
source <(sqlite3 log/log.db "select name, a from result" | 
     awk -F '|' '{printf("a[%s]=%s;\n",$1,$2);}') 
echo ${a[inc.bash]} 

<()構建體(進程替換)可被當作一個文件,並source(或等效.)運行在它的參數的命令,而無需創建子外殼,使得在當前殼訪問所得到的a陣列。

一個簡單的例子來證明,因爲我沒有你的數據庫:

$ declare -A a 
$ source <(echo 'a[inc.bash]=value') 
$ echo "${a[inc.bash]}" 
value 

這一切都這樣說,這大約是使用eval危險:無論你的sqlite/awk腳本的輸出,它會被執行!

+0

哇驚人的答案。謝謝,一切正常。我會在我的博客上提及你。再次感謝你! – Daniel