구성 파일을 구문 분석하고 매개변수를 다른 스크립트에 전달합니다.

구성 파일을 구문 분석하고 매개변수를 다른 스크립트에 전달합니다.

다음 내용이 포함된 구성 파일이 있습니다.

variable1 = 25
variable2 = 36

Bash 스크립트에서 이 파일을 구문 분석하고 각 해당 변수를 스크립트의 올바른 값으로 설정하고 싶습니다. 어떻게 해야 하나요? 내 코드는 맨 아래에 있지만 내용을 표시하는 것뿐입니다. 실제로 스크립트에서 변수와 해당 값을 설정한 다음 특정 변수가 (의사 코드)와 같은 조건을 충족하는지 확인하고 싶습니다.

"variable1 = 25"인 경우 "확인"을 에코합니다.

IFS="="
while read -r name value
do
echo "Content of $name is ${value//\"/}"
done < filename

답변1

한 가지 옵션은 파일의 구문을 수정하고 쉘이파일을 직접 구문 분석. 단점은 셸이 유효한 구문을 구문 분석할 수 있어야 하며 실제로 실행 스크립트의 컨텍스트 내에서 구성 파일을 코드로 실행한다는 것입니다.

다행스럽게도 이미 표시해 놓았습니다 bash. 쉘이 연관 배열을 지원하기 때문에 이는 좋은 일입니다. 이를 통해 쉘이 값을 구문 분석하거나 평가하지 않고도 이러한 값을 읽을 수 있으므로 구성 파일의 내용을 너무 많이 신뢰할 필요가 없습니다.

구성 설정이 한 줄에 하나씩 있다고 가정하면 다음과 같은 코드를 사용하여 읽을 수 있습니다.

#!/bin/bash
#
declare -A config
while IFS=$'[ \t]*=[ \t]*' read -r name value
do
    echo "Read name=$name, value=$value" >&2
    config[$name]="$value"
done

"${config[$name]}"다음과 같은 참조를 사용하여 참조 할 수 있습니다 .

echo "variable1=${config[variable1]}, variable2=${config[variable2]}." >&2

이 구조는 동사에게 기호 주위의 공백을 무시하도록 IFS=$'[ \t]*=[ \t]*'지시 하므로 와 는 동일합니다.read=fruit=pearfruit = pear

답변2

나는 다른 접근법을 제안하고 싶습니다. 변수 파일은 쉘 구문의 할당문과 매우 유사합니다. 유일한 문제는 할당 연산자 주위의 공백입니다(자세한 내용은 여기에서 확인할 수 있습니다).여기). 먼저 sed다음과 같은 명령을 사용하여 공백을 수정할 수 있습니다 .

$ cat vars.txt
variable1 = 25
variable2 = 36

$ sed -i 's/ = /=/' vars.txt

$ cat vars.txt
variable1=25
variable2=36

이 작업을 완료한 후에는 source필요에 따라 모든 변수를 사용하여 파일을 설정하면 됩니다.

#!/bin/bash
source vars.txt
echo "Variable 1: $variable1, Variable 2: $variable2"

결과는 다음과 같습니다.

Variable 1: 25, Variable 2: 36

Roaima가 의견에서 지적했듯이 이 접근 방식에는 보안 문제가 있습니다. 파일을 생성 하면 source실제로 해당 파일이 쉘 스크립트로 실행됩니다(스크립트 실행과 스크립트 가져오기 설명).여기). 이는 파일의 내용을 신뢰해야 함을 의미합니다. 악의적인 사용자나 프로세스가 파일을 편집할 수 있으면 결국 임의의 명령이 실행될 수 있습니다.

또한 roaima가 지적했듯이 변수 값에 특수 문자가 포함된 경우 변수를 인용해야 합니다. 이 답변은 변수에 대한 숫자 값만 포함하는 질문의 데이터 세트를 위해 특별히 작성되었습니다. 다른 유형의 값으로 쉽게 확장되지 않습니다.

관련 정보