bash에서 구성 파일을 읽는 가장 좋은 방법은 무엇입니까?
예를 들어, 스크립트가 있으며 스크립트를 호출 할 때마다 모든 구성을 수동으로 채우지 않습니다.
편집 1 : 나는 그것을 명확하게하지 않았다고 생각합니다. 그래서 : 내가 원하는 것은 … 같은 구성 파일이 있습니다.
variable_name value
variable_name value ...
나는 그것을 읽고 싶습니다. 나는 내가 찾고있는 논쟁에 대해 그것을 grep 할 수 있다는 것을 알고있다. 그러나 더 지능적인 방법이있을 수있다 🙂
답변
mbiber가 말했듯이 source
다른 파일. 예를 들어, 설정 파일 (예 🙂 some.config
은 다음과 같습니다.
var1=val1
var2=val2
스크립트는 다음과 같습니다.
#! /bin/bash
# Optionally, set default values
# var1="default value for var1"
# var1="default value for var2"
. /path/to/some.config
echo "$var1" "$var2"
많은 파일은 /etc/default
일반적으로 비슷한 방식으로 다른 쉘 스크립트의 구성 파일로 사용됩니다. 게시물의 가장 일반적인 예는 다음과 같습니다 /etc/default/grub
. 이 파일은 GRUB의 구성 옵션을 설정하는 데 사용됩니다. GRUB의 grub-mkconfig
소스 옵션은 다음과 같습니다.
sysconfdir="/etc"
#…
if test -f ${sysconfdir}/default/grub ; then
. ${sysconfdir}/default/grub
fi
실제로 양식 구성을 처리해야하는 경우 :
var1 some value 1
var2 some value 2
그런 다음 다음과 같은 작업을 수행 할 수 있습니다.
while read var value
do
export "$var"="$value"
done < /path/to/some.config
(또한 이와 같은 작업을 수행 할 수 eval "$var=$value"
있지만 스크립트를 소싱하는 것보다 위험합니다. 소스 파일보다 실수로이를 쉽게 중단 할 수 있습니다.)
답변
분명히, 나는 bash
여기서 전문가가 아니지만 개념은 사용하는 언어에 따라 다르지 않아야합니다.
예
아래의 예에서 다음 중 하나에 (매우) 기본 스크립트를 사용할 수 있습니다 세트 문자열을, 또는 인쇄 설정 파일에 세트로, 문자열을 :
#!/bin/bash
# argument to set a new string or print the set string
arg=$1
# possible string as second argument
string=$2
# path to your config file
configfile="$HOME/stringfile"
# if the argument is: "set", write the string (second argument) to a file
if [ "$arg" == "set" ]
then
echo "$string" > $configfile
# if the argunment is "print": print out the set string, as defined in your file
elif [ "$arg" == "print" ]
then
echo "$( cat $configfile )"
fi
그때
-
구성 파일에 문자열을 설정하려면
$ '/home/jacob/Bureaublad/test.sh' set "Een aap op een fiets, hoe vind je zoiets?"
-
“configfile”에 정의 된대로 문자열을 출력하려면 다음을 수행하십시오.
$ '/home/jacob/Bureaublad/test.sh' print Een aap op een fiets, hoe vind je zoiets?
물론 실제 적용된 스크립트에서는 인수가 올바른지 확인하기 위해 많은 것을 추가하고 입력이 올바르지 않을 때 수행 할 작업을 결정하고 설정 파일이 존재하지 않는 등을 결정해야합니다.
이것이 기본 아이디어입니다
답변
source
또는 .
을 사용 하여 파일을로드하십시오.
source /path/to/file
또는
. /path/to/file
구성 파일이없는 경우 스크립트를 계속 실행하지 않으려면 파일을로드하기 전에 파일이 존재하는지 확인하는 것이 좋습니다.
답변
나는 이것을 사용하고 있습니다 …
#!/bin/bash
CFG_FILE=/etc/test.conf
CFG_CONTENT=$(cat $CFG_FILE | sed -r '/[^=]+=[^=]+/!d' | sed -r 's/\s+=\s/=/g')
eval "$CFG_CONTENT"
Conf 파일은 sed로 구문 분석 된 후 간단한 변수 asignments로 평가됩니다.
첫 번째 sed 구문 분석 키 값 (지원됨 = 공백으로 묶음)
두 번째 sed는 유효한 변수 할당을 위해 주변의 공백을 제거합니다.
추가 sed 처리를 추가 할 수 있습니다
conf 파일에서 일치하지 않는 다른 텍스트는 모두 제거됩니다 (# 또는; 주석 및 기타 포함)
이 구성 파일에서 한 줄 쉘 명령도 평가할 수 있습니다!
답변
#------------------------------------------------------------------------------
# parse the ini like $0.$host_name.cnf and set the variables
# cleans the unneeded during after run-time stuff. Note the MainSection
# courtesy of : http://mark.aufflick.com/blog/2007/11/08/parsing-ini-files-with-sed
#------------------------------------------------------------------------------
doParseConfFile(){
# set a default cnfiguration file
cnf_file="$run_unit_bash_dir/$run_unit.cnf"
# however if there is a host dependant cnf file override it
test -f "$run_unit_bash_dir/$run_unit.$host_name.cnf" \
&& cnf_file="$run_unit_bash_dir/$run_unit.$host_name.cnf"
# yet finally override if passed as argument to this function
# if the the ini file is not passed define the default host independant ini file
test -z "$1" || cnf_file=$1;shift 1;
test -z "$2" || ini_section=$2;shift 1;
doLog "DEBUG read configuration file : $cnf_file"
doLog "INFO read [$ini_section] section from config file"
# debug echo "@doParseConfFile cnf_file:: $cnf_file"
# coud be later on parametrized ...
test -z "$ini_section" && ini_section='MAIN_SETTINGS'
doLog "DEBUG reading: the following configuration file"
doLog "DEBUG ""$cnf_file"
( set -o posix ; set ) | sort >"$tmp_dir/vars.before"
eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/#.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\"']*\)$/\1=\"\2\"/" \
< $cnf_file \
| sed -n -e "/^\[$ini_section\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`
( set -o posix ; set ) | sort >"$tmp_dir/vars.after"
doLog "INFO added the following vars from section: [$ini_section]"
cmd="$(comm -3 $tmp_dir/vars.before $tmp_dir/vars.after | perl -ne 's#\s+##g;print "\n $_ "' )"
echo -e "$cmd"
echo -e "$cmd" >> $log_file
echo -e "\n\n"
sleep 1; printf "\033[2J";printf "\033[0;0H" # and clear the screen
}
#eof func doParseConfFile