2011-07-08 22 views
0

all!從自定義文件中讀取程序的參數並使用該參數運行該程序

我需要從包括像字符串的文件「數據」讀參數:

-a -camb="1 0.5 1",diff="1 0 0" -q=5 
-a -camb="0 1 0" -p -q -f=10 
... 

接下來,該參數必須傳遞給一個程序./test腳本中:

#!/bin/bash 

while read line 
do 
    ./test "$line" 
done < "./data" 

問題是「$ line」作爲argv [1]傳遞給./test,而不是argv [1],argv [2],argv [3]

如何分割字符串行到幾個參數?即./test必須採用argv [1],argv [2]等等。

請注意,-camb =「1 0.5 1」,diff =「1 0 0」必須作爲整個參數,argv [2]!

回答

2

可以爲此使用eval:

#!/bin/bash 

while read line 
do 
    eval "./test $line" 
done < "./data" 

但是有是一個很大的警告這裏:比你想的eval可以做的文件內容更多的解釋。例如,如果它包含任何I/O重定向(例如>somefile),則會應用它們。同樣,$variable將被替換; somecommand作爲一個單獨的命令執行等。基本上,如果數據文件的內容不夠乾淨,您可能會得到一些意想不到的和潛在危險的結果。

+0

+1對於潛在危險數據的警告。 –

1

引號是literal, not syntactic,這意味着它們將不會像在shell上那樣被處理。但是你可以通過在一個陣列設置它們處理它們:

$ params(){ 
    for param in "[email protected]" 
    do 
     echo "$param" 
    done 
} 
$ while IFS= read -r line 
do 
    declare -a par="($line)" 
    params "${par[@]}" 
    echo 
done < data 
-a 
-camb=1 0.5 1,diff=1 0 0 
-q=5 

-a 
-camb=0 1 0 
-p 
-q 
-f=10 

PS:Don't use eval

+0

@IObO:爲什麼這項工作?什麼是IFS =?爲什麼使用read -r? Thx – grok12

+1

有關它如何工作的詳細信息,有關於關鍵字的優秀文章(['IFS'](http://mywiki.wooledge.org/IFS),['while read']](http://mywiki.wooledge .org/BashFAQ/001),[參數](http://mywiki.wooledge.org/BashGuide/Parameters))和Bash'man'頁面。如果你想真正學習Bash,那麼這些頁面和所有來自那裏的鏈接都值得用黃金打印。 – l0b0

+0

Thx爲鏈接。我現在瞭解你的腳本,除了一件事情:爲什麼你的聲明語句會破壞短劃線符號上的行變量?我很困惑。 – grok12