多くの変数を bash に解析するにはどうすればよいでしょうか?

多くの変数を bash に解析するにはどうすればよいでしょうか?

プログラムはデータを次の形式で出力します。

n=4607356
null_cells=5668556
cells=10275912
min=0.0433306089835241
max=0.53108499199152
range=0.487754383007996
mean=0.40320252333736
mean_of_abs=0.40320252333736
stddev=0.0456556814489487
variance=0.00208444124856788
coeff_var=11.3232628285782
sum=1857697.565113524
first_quartile=0.378443
median=0.410276
third_quartile=0.435232
percentile_90=0.457641

そして、それらの変数のいくつかを bash に解析して、スクリプトで使用できるようにします。例:

$n = 4607356
$median = 0.410276

など、一気に行えます。

どうやってやるの?

答え1

最も簡単な方法は、出力をファイルにリダイレクトし、このファイルをソースにすることです。

スクリプトでは次のようになります:

#!/bin/sh
program > tmp_file
. tmp_file
rm tmp_file
echo $any_var_you_need

bash一時ファイルなしで実行することもできます:

#!/bin/bash
source <(program)
echo $any_var_you_need

唯一の理論上のセキュリティホールは、プログラムが何かを破壊する危険なコードを出力する可能性があることです。

programの出力をチェックしてsed、変数のみが含まれていることを確認することでこれを回避できます。

program | sed '/^\s*[a-zA-Z_.][_a-zA-Z0-9]*=[a-zA-Z0-9_-+.,]*/!d;s/ .*//;'

変数ではないと思われる文字列はすべて削除されます (好みに応じて編集できます)。

答え2

@rush が述べたのと同じセキュリティ上の注意を払うと、evalコマンドの先頭に追加するだけで済みます。もちろん、どちらの場合も、有効な bash 構文でない場合はエラーが発生します (無視できます)。

例:

$ echo 'a=1
> b=2
> c=1234'
a=1
b=2
c=1234
$ echo $b

$ eval echo 'a=1
b=2
c=1234'
a=1
$ echo $b
2

関連情報