값이 다른 변수에 따라 달라지는 변수를 설정합니다.

값이 다른 변수에 따라 달라지는 변수를 설정합니다.

텍스트 파일이 있습니다변수.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그것이 무엇을 하는지 알아보려면 계속 읽어보세요 .

반품,For를 사용하여 줄을 읽지 마세요.그리고더 많은 인용문 사용

답변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

관련 정보