Ein Programm gibt seine Daten in diesem Format aus:
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
Und ich möchte einige dieser Variablen in Bash analysieren, damit ich sie in meinem Skript verwenden kann, z. B.:
$n = 4607356
$median = 0.410276
und so weiter, in einem Rutsch.
Wie kann ich das machen?
Antwort1
Der einfachste Weg scheint zu sein, die Ausgabe in eine Datei umzuleiten und diese Datei dann als Quelle zu verwenden.
Im Skript sieht es folgendermaßen aus:
#!/bin/sh
program > tmp_file
. tmp_file
rm tmp_file
echo $any_var_you_need
Sie bash
können es ganz ohne temporäre Datei tun:
#!/bin/bash
source <(program)
echo $any_var_you_need
Die einzige theoretische Sicherheitslücke besteht darin, dass das Programm möglicherweise gefährlichen Code ausgibt, der etwas zerstört.
Sie können dies vermeiden, indem Sie program
die Ausgabe von prüfen, um sed
sicherzugehen, dass sie nur Variablen enthält:
program | sed '/^\s*[a-zA-Z_.][_a-zA-Z0-9]*=[a-zA-Z0-9_-+.,]*/!d;s/ .*//;'
Dadurch werden alle Zeichenfolgen entfernt, die keine Variablen zu sein scheinen (können nach Belieben bearbeitet werden).
Antwort2
Mit dem gleichen Sicherheitsvorbehalt wie @rush erwähnt, könnten Sie eval
Ihrem Befehl einfach voranstellen. Natürlich führt in beiden Fällen alles, was keine gültige Bash-Syntax ist, zu einem Fehler (den Sie ignorieren können).
Beispiel:
$ 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