[bash] Bash를 사용하여 변수 파일을 참조하는 방법은 무엇입니까?
변수의 설정 파일을 호출하고 싶습니다 .bash에서 어떻게 할 수 있습니까?
따라서 설정 파일은 변수를 정의합니다 (예 : CONFIG.FILE).
production="liveschool_joe"
playschool="playschool_joe"
그리고 스크립트는 그 변수를 사용합니다
#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
bash가 어떻게 그런 일을 할 수 있습니까? awk / sed 등을 사용해야합니까?
답변
짧은 대답
source
명령을 사용하십시오 .
사용하는 예 source
예를 들면 다음과 같습니다.
config.sh
#!/usr/bin/env bash
production="liveschool_joe"
playschool="playschool_joe"
echo $playschool
script.sh
#!/usr/bin/env bash
source config.sh
echo $production
sh ./script.sh
이 예제 의 출력 은 다음과 같습니다.
~$ sh ./script.sh
playschool_joe
liveschool_joe
source
명령이 실제로 프로그램을 실행 하기 때문 입니다. 모든 config.sh
것이 실행됩니다.
또 다른 방법
내장 export
명령을 사용할 수 있으며 “환경 변수”를 가져오고 설정하면이 작업을 수행 할 수 있습니다.
실행 export
및 것은 echo $ENV
당신이 변수 액세스에 대해 알아야 할 모든해야한다. 환경 변수에 액세스하는 것은 로컬 변수와 같은 방식으로 수행됩니다.
설정하려면 다음과 같이 말합니다.
export variable=value
명령 줄에서. 모든 스크립트는이 값에 액세스 할 수 있습니다.
답변
점을 사용하면 더 짧아집니다.
#!/bin/bash
. CONFIG_FILE
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
답변
source
다른 스크립트를 가져 오려면 명령을 사용하십시오 .
#!/bin/bash
source /REFERENCE/TO/CONFIG.FILE
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
답변
나는 보안의 CAS에서 특별히 같은 문제가 있으며 해결책을 찾았습니다. 여기서 .
내 문제는 bash에 배포 스크립트를 작성하여 이와 같은 경로를 구성하는 구성 파일로 작성하고 싶었다는 것입니다.
################### Config File Variable for deployment script ##############################
VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
VAR_CONFIG_FILE_DIR="/home/erman/config-files"
VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"
기존 솔루션은 “SOURCE”명령을 사용하고이 변수와 함께 구성 파일을 가져옵니다. ‘SOURCE path / to / file’그러나이 솔루션에는 소스 파일에 Bash 스크립트가 포함 할 수있는 모든 것이 포함될 수 있으므로 보안 문제가 있습니다. 보안 문제가 발생합니다. Malicicios 사용자는 스크립트가 구성 파일을 소싱 할 때 임의의 코드를 “실행”할 수 있습니다.
이런 식으로 상상해보십시오.
################### Config File Variable for deployment script ##############################
VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
VAR_CONFIG_FILE_DIR="/home/erman/config-files"
VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"; rm -fr ~/*
# hey look, weird code follows...
echo "I am the skull virus..."
echo rm -fr ~/*
이 문제를 해결하기 위해 NAME=VALUE
해당 파일 형식의 구문 만 (변수 할당 구문), 주석 (기술적으로 주석은 중요하지 않음) 만 허용 할 수 있습니다 . 따라서, egrep
동등한 명령 을 사용하여 구성 파일을 확인할 수 있습니다 grep -E
.
이것이 내가 문제를 해결 한 방법입니다.
configfile='deployment.cfg'
if [ -f ${configfile} ]; then
echo "Reading user config...." >&2
# check if the file contains something we don't want
CONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(\`]*$)"
if egrep -q -iv "$CONFIG_SYNTAX" "$configfile"; then
echo "Config file is unclean, Please cleaning it..." >&2
exit 1
fi
# now source it, either the original or the filtered variant
source "$configfile"
else
echo "There is no configuration file call ${configfile}"
fi
답변
Bash에서 파일 대신 일부 명령의 출력을 제공합니다.
source <(echo vara=3) # variable vara, which is 3
source <(grep yourfilter /path/to/yourfile) # source specific variables
답변
매개 변수 파일을 환경 변수로 변환
일반적으로 파일에서 특정 아티팩트의 복잡성을 피하기 위해 소싱 대신 구문 분석을 진행합니다. 또한 따옴표와 다른 것들을 특별히 처리하는 방법도 제공합니다. 내 주요 목표는 ‘=’뒤에 오는 모든 것을 리터럴, 큰 따옴표 및 공백으로 유지하는 것입니다.
#!/bin/bash
function cntpars() {
echo " > Count: $#"
echo " > Pars : $*"
echo " > par1 : $1"
echo " > par2 : $2"
if [[ $# = 1 && $1 = "value content" ]]; then
echo " > PASS"
else
echo " > FAIL"
return 1
fi
}
function readpars() {
while read -r line ; do
key=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\1/')
val=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\2/' -e 's/"/\\"/g')
eval "${key}=\"${val}\""
done << EOF
var1="value content"
var2=value content
EOF
}
# Option 1: Will Pass
echo "eval \"cntpars \$var1\""
eval "cntpars $var1"
# Option 2: Will Fail
echo "cntpars \$var1"
cntpars $var1
# Option 3: Will Fail
echo "cntpars \"\$var1\""
cntpars "$var1"
# Option 4: Will Pass
echo "cntpars \"\$var2\""
cntpars "$var2"
인용 된 텍스트를 cntpars
함수에 공간이있는 단일 매개 변수로 간주하기 위해해야 할 작은 트릭에 주목하십시오 . 한 단계의 추가 평가가 필요했습니다. 옵션 2에서와 같이 이렇게하지 않으면 다음과 같이 2 개의 매개 변수를 전달했을 것입니다.
"value
content"
명령 실행 중 큰 따옴표는 매개 변수 파일의 큰 따옴표를 유지합니다. 따라서 세 번째 옵션도 실패합니다.
다른 옵션은 옵션 4에서와 같이 단순히 큰 따옴표로 변수를 제공하지 않고 필요할 때 변수를 인용하도록하는 것입니다.
명심해야 할 것.
실시간 조회
내가하고 싶은 또 다른 일은 환경 변수를 사용하지 않고 실시간 조회를 수행하는 것입니다.
lookup() {
if [[ -z "$1" ]] ; then
echo ""
else
${AWK} -v "id=$1" 'BEGIN { FS = "=" } $1 == id { print $2 ; exit }' $2
fi
}
MY_LOCAL_VAR=$(lookup CONFIG_VAR filename.cfg)
echo "${MY_LOCAL_VAR}"
가장 효율적이지는 않지만 작은 파일을 사용하면 매우 깨끗하게 작동합니다.
답변
변수가 생성되어 파일에 저장되지 않은 경우 변수를로 파이프 할 수 없습니다 source
. 믿을 수 없을 정도로 간단한 방법은 다음과 같습니다.
some command | xargs