내 스크립트에 도움이 필요합니다.
다음과 같은 환경 변수가 있습니다.
SECRET_OF_AN_APP_dev=123
SECRET_OF_AN_APP_test=456
SECRET_OF_AN_APP_prod=789
변경할 수 있는 스크립트를 원합니다.SECRET_OF_AN_APP_dev=123도착하다SECRET_OF_AN_APP=123첫 번째 반복에서 이를 env로 내보낸 다음SECRET_OF_AN_APP_TEST=456로 변경SECRET_OF_AN_APP=456두 번째 반복 등에서
#!/bin/bash
APP_SECRET=SECRET_OF_AN_APP
ENVIRONMENT_NAME=dev
LIST_OF_ENVIRONMENTS=[dev, prod, test...]
for i in $LIST_OF_ENVIRONMENTS
do
APP_SECRET=$(env | grep APP_SECRET_$i | sed 's/APP_SECRET_'"$i"'=//g' ) >> var.bash
. ./var.bash
./some_script_where_$APP_SECRET_is_required.sh
done
echo $SECRET_OF_AN_APP
내 스크립트는 다음을 수행할 때 비어 있기 때문에 서브쉘처럼 작동한다고 생각합니다 .
이 루프 내에서 실행되는 다른 스크립트에는 이러한 변수가 필요하므로 이를 설정해야 합니다.
나는 export
, with ./var.bash
, with set -o allexport
등을 시도했습니다.
아무것도 작동하지 않습니다.
스크립트뿐만 아니라 셸에 "echo $SECRET_OF_AN_APP"을 포함해야 합니다. 스크립트대로 실행 중입니다. 하지만 내 환경 변수에는 설정되어 있지 않습니다.
답변1
여러분을 괴롭히는 한 가지 문제는 env | grep APP_SECRET_$i
APP_SECRET 값을 예상되는 SECRET_OF_AN_APP 변수 이름으로 바꾸지 않았다는 것입니다. 이 문제를 해결하려면 APP_SECRET에 변수 확장을 추가하세요.
APP_SECRET 할당의 출력을 캡처 $(env ...)
한 다음 해당 할당의 출력을 파일로 리디렉션했습니다. 명령 대체의 출력은 정확하고 APP_SECRET에 할당될 수 있지만 해당 할당 텍스트는 출력 파일에 나타나지 않습니다.
APP_SECRET을 내보내거나(이 쉘 스크립트에 할당되었으므로) 할당을 파일로 인쇄하고 할당을 가져오기 전에 할당 리디렉션을 건너뜁니다.
누구나:
export APP_SECRET
또는:
APP_SECRET=$(varname=${APP_SECRET}_${i}; printf '%s' "${!varname}" )
declare -p APP_SECRET >> var.bash
echo "export APP_SECRET" >> var.bash # if you need it to be exported
원하는 실제 변수 값의 이름을 보유하기 위해 변수를 결합하도록 명령 대체를 단순화했습니다. 밑줄이 APP_SECRET 변수의 일부로 간주되지 않도록 여기에서는 중괄호를 사용합니다. 그런 다음 bash의 변수 간접 확장을 사용하여 "varname"을 변수 이름으로 확장한 다음 값을 가져옵니다.저것바꾸다. 예를 들어 "varname"을 "SECRET_OF_AN_APP_dev"로 변환한 다음 해당 값(예: 123)을 찾습니다.
이 스크립트가 종료된 후 쉘이 APP_SECRET 값을 사용해야 하는 경우 상위 쉘은 var.bash 파일에서 소스를 가져와야 합니다.
. ./var.bash
또한보십시오:
답변2
이것이 당신이 찾고 있는 것입니까?
#!/bin/bash
SECRET_OF_AN_APP_dev=123
SECRET_OF_AN_APP_test=456
SECRET_OF_AN_APP_prod=789
for s in dev test prod
do
name=SECRET_OF_AN_APP_$s
echo $name
SECRET_OF_AN_APP=${!name}
echo $SECRET_OF_AN_APP
export SECRET_OF_AN_APP
some_app_which_uses_that_variable
done