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

관련 정보