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
Bash에서 파일 대신 일부 명령의 출력을 소스하려면:
source <(echo vara=3) # variable vara, which is 3
source <(grep yourfilter /path/to/yourfile) # source specific variables
특히 보안과 관련해서는 같은 문제가 있는데 여기서 해결책을 찾았습니다.
문제는 이와 같은 경로가 포함된 구성 파일을 사용하여 Bash로 배포 스크립트를 작성하려는 것이었습니다.
################### Configuration 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 경로/파일'
그러나 원본 파일에 Bash 스크립트가 포함할 수 있는 모든 항목이 포함될 수 있기 때문에 이 솔루션에는 몇 가지 보안 문제가 있습니다.
보안 문제가 발생합니다.스크립트가 구성 파일을 원본화할 때 악의적인 사용자가 임의 코드를 "실행"할 수 있습니다.
다음과 같은 것을 상상해 보십시오.
################### Configuration 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 configuration...." >&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 "The configuration file is unclean. Please clean 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
매개 변수 파일을 환경 변수로 변환
보통 저는 제 파일에 있는 특정 아티팩트의 복잡성을 피하기 위해 소싱 대신 구문 분석을 합니다.또한 견적서 등을 특별히 처리할 수 있는 방법도 제공합니다.제 주요 목표는 '=' 뒤에 오는 모든 것을 문자 그대로 유지하는 것입니다. 큰따옴표와 공백도 마찬가지입니다.
#!/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에서와 같이 이 작업을 수행하지 않으면 다음과 같이 두 개의 매개 변수를 전달할 수 있습니다.
"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
이름 지정 충돌을 방지하기 위해 필요한 변수만 가져오십시오.
variableInFile () {
variable="${1}"
file="${2}"
echo $(
source "${file}";
eval echo \$\{${variable}\}
)
}
변수가 포함된 스크립트는 Bash를 사용하여 가져올 수 있습니다.
스크립트 변수를 고려합니다.sh 파일:
#!/bin/sh
scr-var=value
변수가 사용될 실제 스크립트를 고려합니다.
#!/bin/sh
bash path/to/script-variable.sh
echo "$scr-var"
언급URL : https://stackoverflow.com/questions/5228345/how-can-i-reference-a-file-for-variables-using-bash
'programing' 카테고리의 다른 글
파이썬 3 정수 나눗셈 (0) | 2023.05.29 |
---|---|
WPF 목록 보기 해제 선택 (0) | 2023.05.29 |
커서를 대기 커서로 돌리게 하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
jQuery 처음을 제외한 모든 테이블 행 삭제 (0) | 2023.05.29 |
Objective-C 코코아 응용 프로그램의 정규식 (0) | 2023.05.29 |