텍스트 파일이 있습니다변수.txt내가 변수를 저장하는 곳
호스트=/srv/www/vhosts/hosting
지수 =$호스트/index.php
보시다시피 두 번째 변수는 첫 번째 변수에 따라 달라집니다.
또한 이러한 변수를 로드하는 스크립트 파일도 있습니다.
f=~/variables.txt
for line in $(cat $f)
do
export $line
done
스크립트 파일을 실행하면 첫 번째 변수가 로드되지만 두 번째 변수는 로드되지 않습니다.
bash: $host/index.php: No such file or directory
이는 첫 번째 변수를 로드한 후이기 때문입니다.주인, 두 번째 변수를 설정하는 데 사용된 값을 기억하지 못합니다.색인.
그렇다면 이 문제를 해결하는 방법은 무엇입니까? export
루프에 설정된 변수 값을 기억하도록 (?) 추가 옵션이나 인수가 전달되어야 한다고 생각합니다 for
.
답변1
가장 먼저 주목해야 할 점은 이러한 변수를 내보낼 필요가 없다는 것입니다.오직하위 프로세스가 상속된 환경에서 변수를 쿼리하는 경우. 가장 일반적으로 사람들은 변수를 내보낸 다음 유사한 작업을 수행합니다 somecmd "$myexportedvar"
. 당신의 껍질은 $myexportedvar
당신이 보기도 전에 확장됩니다.somecmd
해당 환경에서 추출하기 위해 이러한 하위 프로세스를 내보내야 하는 경우:
while IFS= read -r line; do
if [[ $line == *=* && $line != #* ]]; then
IFS== read -r var val <<<"$line"
printf -v "$var" '%s' "$val"
export "$var"
fi
done < "$HOME/variables.txt"
이 루프는 해당 줄이 할당(일종의)이고 첫 번째 문자가 주석 해시가 아닌지 확인합니다. 노력을 더 강하게 하기는 하지만 간신히 그럴 뿐입니다. 이 문제를 보다 주의 깊게 처리하려면 아래 두 가지 옵션을 참조하세요.
그건 그렇고, 위의 루프는 당신이구현하다구문 분석된 파일입니다. source
각 행을 평가하고 실제로 실행하면 루프가 해당 "문제"를 제거합니다(문제라고 생각하는 경우).
또는 원본 파일의 변수를 내보내면 source "$HOME/variables.txt"
작업이 완료됩니다.
그냥 사용하고 싶을 수도 있습니다 set -a; . "$HOME"/variables.txt; set +a
. 이렇게 하면 소스 파일에 포함되지 않는 문제를 피할 수 있습니다.홀로숙제. 위의 구문 분석 루프는 잘못된 긍정을 유발할 수 있습니다. help set
그것이 무엇을 하는지 알아보려면 계속 읽어보세요 .
답변2
이 작업을 수행하는 더 쉬운 방법이 있습니다.
cat vars
host=/srv/www/vhosts/hosting
index=$host/index.php
내 테스트 스크립트:
#!/bin/bash
. ./vars
echo $host
echo $index
구현하다
./printvars.sh
/srv/www/vhosts/hosting
/srv/www/vhosts/hosting/index.php
기본적으로 ../vars는 파일을 실행하고 변수를 로드합니다.
답변3
내 제안은 해당 파일을 가져와서 "variables.txt" 파일의 모든 내용을 내보내는 것입니다. 최신 텍스트 편집기에서는 "열 편집"을 허용해야 합니다. 그렇지 않으면 수정 내용을 스크립트로 작성할 수 있습니다.
그러나 다음 스크립트를 사용하여 귀하의 질문에 답변했습니다.
#!/bin/sh
f=./variables.txt
source ${f}
for vname in $(cut -f1 -d'=' ${f})
do
export ${vname}
done
차이점은 모든 변수가 이 셸의 범위 내에서 정의되고 올바른 해석을 갖도록 먼저 Variables.txt 파일을 가져온다는 것입니다. 그래야만 변수 이름(vname)만 가져와서 파일의 모든 변수를 내보낼 수 있습니다.
참고로 변수를 보호하려면 ${}를 사용해야 합니다.
답변4
이 작업은 두 단계로 수행할 수 있습니다.
. ./vars
while read line; do
export $(printf "%s" "$line" | grep = | cut -d= -f 1)
done < vars
아니면 그냥
while read line; do
eval export "$line"
done < vars