2011-06-28 140 views
3

我需要在腳本中執行任意次數的關聯任意參數的命令。簡化BASH腳本設計

我已經決定,該腳本將採取的線索,從一個參數文件(parameter.txt),其中線的形式是:

label param1 param2 

對於parameter.txt每一行,我會打電話給命令指定的參數。

到目前爲止,我的修修補補將沿着如下的線路移動,但它看起來凌亂:

while read line; do 
    echo $line | sed -r 's/[^ ]+ ([^ ]+).+/\1/' && 
     echo $line | sed -r 's/[^ ]+ [^ ]+ ([^ ]+)/\1/' 
done < parameter.txt 

我的命令的格式是:

mycmd -a param1 -b param2 > label 

我能得到一些建議我怎麼可能簡化這個?

我這樣做是爲它的「助手」命令供不應求一個小型的嵌入式系統(xargs例如不可用,事情就是這樣awk都步履蹣跚busybox的實現),而我使用的版本2(2.04g我認爲)BASH。

回答

6
while read label param1 param2; do 
    mycmd -a "$param1" -b "$param2" > "$label" 
done < parameter.txt 
+0

喜歡它。爲了簡潔而讓我滿意,並且讓我感到羞恥,因爲我們不在閱讀'man'頁面。 – Jamie

+0

如果您想在param3之後忽略,請改爲使用'read label param1 param2 ignored'。 – kamae

3

我建議一個函數,只要沒有嵌入空格。

function x() 
{ 
    mycmd -a $2 -b $3 >$1 
} 

while read line; do x $line ; done <parameter.txt 
+0

不錯,優雅! –

+0

不錯。我沒有想過用函數調用來對參數化行進行參數化,會將其添加到我的技巧中。 +1 – Jamie

1

試試這個:

while read line ; do 
    set -- $line 
    dest="$1" 
    shift 

    mycmd "[email protected]" > "$dest" 
done < parameter.txt 

應該工作。如果文件中的參數有空格,則必須正確引用它們。

我建議將-a,0 -b添加到文件parameter.txt,因爲在飛行中生成它們可能很脆弱。

如果你不喜歡這個解決方案,那麼我建議從這個包含實際命令的腳本創建一個新的腳本。這樣,您可以輕鬆調試任何問題。

當腳本看起來沒問題時,您可以使用source ./generated.sh來源(是的,您必須指定路徑)。