환경 변수가 있습니다. 이러한 값을 여러 개 동적으로 변환하고 싶습니다.
printenv | grep proj_env_repo
환경 변수: (like this) 를 사용하여 이 환경 변수를 얻습니다 printenv | grep $value
.
따라서 값은proj_env_repo
내 결과는
proj_env_repo_db_username=username
으로 변환하고 싶습니다.TF_ENV_db_username=username
누구든지 나를 도와줄 수 있나요? Bash 스크립트에서 함수를 찾고 있습니다.
답변1
다음에서 변수 이름 접두사 일치 및 변수 간접 사용을 사용합니다 bash
.
proj_env_repo_db_username=username
proj_env_repo_db_host=host
proj_env_repo_db_port=port
for variable in "${!proj_env_repo@}"; do
export "TF_ENV${variable#proj_env_repo}"="${!variable}"
done
"${!proj_env_repo@}"
이 루프는 이름 접두어를 공유하는 변수 이름 목록을 생성 하는 데 사용됩니다 proj_env_repo
. 각 반복에는 $variable
이러한 변수 중 하나의 이름이 나타납니다 .
루프 내부에서는 export
접두사를 제거 하고 문자열로 대체하여 proj_env_repo
새 환경 변수를 만드는 데 사용됩니다 TF_ENV
. 새 환경 변수의 값은 변수 간접 참조 ${!variable}
, 즉 이름이 저장된 변수의 값을 사용하여 얻습니다 $variable
.
원래 변수를 추가로 설정 해제하려면 루프가 끝나기 전에 after를 사용하세요 unset "$variable"
.export
추적을 켠 상태에서 테스트 실행해 보세요.
$ bash -x script.sh
+ proj_env_repo_db_username=username
+ proj_env_repo_db_host=host
+ proj_env_repo_db_port=port
+ for variable in "${!proj_env_repo@}"
+ export TF_ENV_db_host=host
+ TF_ENV_db_host=host
+ for variable in "${!proj_env_repo@}"
+ export TF_ENV_db_port=port
+ TF_ENV_db_port=port
+ for variable in "${!proj_env_repo@}"
+ export TF_ENV_db_username=username
+ TF_ENV_db_username=username
함수로서, 이전 이름 접두사를 첫 번째 인수로 취하고 새 접두사를 두 번째 인수로 사용합니다.
rename_var () {
# Make sure arguments are valid as variable name prefixes
if ! [[ $1 =~ ^[a-zA-Z_][a-zA-Z_0-9]*$ ]] ||
! [[ $2 =~ ^[a-zA-Z_][a-zA-Z_0-9]*$ ]]
then
echo 'bad variable name prefix' >&2
return 1
fi
eval 'for variable in "${!'"$1"'@}"; do
export "'"$2"'${variable#'"$1"'}"="${!variable}"
done'
}
구문이 지원되지 않으므로 여기서는 오버 루프를 사용합니다 eval
. 이 함수는 및 (함수의 첫 번째 및 두 번째 매개 변수에 제공됨) 값을 기반으로 변수 이름을 바꾸기 위한 적절한 쉘 코드(문자열)를 구성한 다음 이 쉘 코드를 실행하는 데 사용됩니다.bash
${!$1@}
$1
$2
eval
이 기능을 다음과 같이 사용할 수 있습니다.
rename_var project_env_repo TF_ENV
...또는 변수를 사용하여
rename_var "$old_variable_prefix" "$new_variable_prefix"
참고: 이와 같은 작업을 수행할 때( eval
사용자 입력을 사용하여)~ 해야 하다평가한 코드가 작동하고 예상한 대로 작동하는지 테스트하세요. 이 경우 이는 유효한 변수 이름 접두사로 유효성을 검사하는 $1
것을 의미합니다. $2
그렇지 않으면 최소한 따옴표를 사용하면 }
에서 구문 오류가 발생하고 eval
명령이 삽입될 가능성이 있습니다.
참고: 이번이 처음입니다(제 생각에는)가지다사용eval
. 나는 위의 코드를 사용해야 하는 위치에 결코 놓지 않을 것이지만 분명히 이 질문의 뒷이야기를 모르기 때문에 이것은 실제로 질문에 대한 비판이 아닙니다(그 자체로 흥미로운 질문입니다) .
관련(소프트웨어 엔지니어링 웹사이트):
답변2
답변3
for v in `printenv | grep proj_env_repo`
do
eval `echo "$v=\$$v" | sed -e 's/proj_env_repo/TF_ENV/'`
unset $v
done
인쇄물 echo
:
proj_env_repo_db_username=$proj_env_repo_db_username
sed
with의 첫 번째 인스턴스를 변환합니다 .proj_env_repo
TF_ENV
TF_ENV_db_username=$proj_env_repo_db_username
eval
진술을 평가하십시오 .
unset
이전 변수가 삭제되었는지 확인하세요 .