プログラムは次の形式でデータを出力します。
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