다음 내용이 포함된 구성 파일이 있습니다.
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=pear
fruit = 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가 지적했듯이 변수 값에 특수 문자가 포함된 경우 변수를 인용해야 합니다. 이 답변은 변수에 대한 숫자 값만 포함하는 질문의 데이터 세트를 위해 특별히 작성되었습니다. 다른 유형의 값으로 쉽게 확장되지 않습니다.