2011-06-28 15 views
3

スクリプト内の任意の回数、関連する任意のパラメータでコマンドを実行する必要があります。BASHスクリプト設計を簡略化

私はスクリプトがラインの形式は、パラメータ・ファイル( parameter.txt)からその手がかりを取ることを決定した

parameter.txtに各行の

label param1 param2 

、私は指定してコマンドを呼び出しますパラメーター。

はこれまでのところ、私の工夫は、次のラインに沿って動いているが、それは厄介探している:

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

それを愛する。簡略化のための完全なポイントと、 'read' manページをRFMしないための愚かさを感じさせます。 – 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-bをファイルparameter.txtに追加することをお勧めします。これは、オンザフライでの生成がおそらく脆弱なためです。

このソリューションが気に入らない場合は、実際のコマンドが含まれている新しいスクリプトを作成することをお勧めします。そうすれば、問題を簡単にデバッグできます。

スクリプトが正常に見える場合は、source ./generated.shでソースを指定できます(はい、パスを指定する必要があります)。