변수 문자열이 배열에 저장된 bash 변수 목록을 설정 해제하고 싶습니다.

변수 문자열이 배열에 저장된 bash 변수 목록을 설정 해제하고 싶습니다.

start.sh"사용자로부터 전달된 환경 변수를 가져오고 싶습니다"라는 스크립트를 호출하는 Dockerfile을 만들고 있습니다. docker-compose.yml또는 docker run -e지금 하고 싶은 작업은 이러한 변수 목록을 배열에 동적으로 정의하는 것입니다.

## Environment Variables
## Missing Vars off the hop SLACK_HOOK_URL
CONFIG_SETTINGS=(
  AWS_ID
  AWS_SECRET
  BUCKET_REGION
  BUCKET_NAME
  DB_USER
  DB_PASSWORD
  DB_HOSTIP
  DB_PORT
  DB_NAME
)

이 배열에 정의된 위 변수의 하위 집합을 간단히 설정 해제했습니다.

CONFIG_SECRETS=(
  AWS_ID
  AWS_ID_STR
  AWS_SECRET
  AWS_SECRET_STR
  BUCKET_NAME
  BUCKET_NAME_STR
  DB_USER
  DB_USER_STR
  DB_PASSWORD
  DB_PASSWORD_STR
  DB_HOSTIP
  DB_HOSTIP_STR
  DB_PORT
  DB_PORT_STR
  DB_NAME
  DB_NAME_STR
)

내 문제는 다음 for 루프에 있습니다.

## Sanitization section
for i in "${!CONFIG_SECRETS[@]}"; do
  ## Nullify environment variables that contain secrets before launching.
  # echo ${CONFIG_SECRETS[$i]}
  eval $"${CONFIG_SECRETS[$i]}"=$""
  unset $"${CONFIG_SECRETS[$i]}"
  echo \$${CONFIG_SECRETS[$i]} is now to: $"${CONFIG_SECRETS[$i]}"
done

예를 들어, 아래는 이러한 변수를 반복하고 설정하기 위해 만든 for 루프입니다.

for i in "${!CONFIG_SETTINGS[@]}"; do
  echo ${CONFIG_SETTINGS[$i]}"_KEY"
  ## Indirect references http://tldp.org/LDP/abs/html/ivr.html
  eval FROM_STRING=\$"${CONFIG_SETTINGS[$i]}_STR"
  eval VALUE_STRING=\$${CONFIG_SETTINGS[$i]}
  eval KEY_STRING=\$"${CONFIG_SETTINGS[$i]}_KEY"
  TO_STRING="$KEY_STRING$VALUE_STRING"
  sed -i '' "s/$FROM_STRING/$TO_STRING/g" ./config.tmpl
done

그러면 다음 구성 파일이 수정됩니다.

{
  "aws_id": "YOUR-AWS-ID",
  "aws_secret": "YOUR-AWS-SECRET",
  "bucket_region": "YOUR-BUCKET-REGION",
  "bucket_name": "YOUR-BUCKET-NAME",
  "db_conn": "USER:PASSWORD@tcp(localhost:3306)/DBNAME",
  "slack_hook_url": ""
}

이 질문의 범위를 벗어나는 내용을 제외한 전체 상황별 스크립트입니다.

#!/bin/bash

## Launch service will tell prism-bin what mode to run in.
LAUNCHMODE="${MODE:-$1}"

## This variable will be what can override default launch args.  I may modify this as I learn more about prism-bin
LAUNCHARGS="${CUSTOM_ARGS:-$2}"

## This is setup this way to handle any situations that might arise from the
## config being JSON and bash not being any good at JSON.
# ## Strings to replace.
AWS_ID_STR="YOUR-AWS-ID"
AWS_SECRET_STR="YOUR-AWS-SECRET"
BUCKET_REGION_STR="YOUR-BUCKET-REGION"
BUCKET_NAME_STR="YOUR-BUCKET-NAME"
DB_USER_STR="USER"
DB_PASSWORD_STR="PASSWORD"
DB_HOSTIP_STR="localhost"
DB_PORT_STR="3306"
DB_NAME_STR="DBNAME"

# Environment Variables/Defaults
## Json sucks in BASH/Shell so you need to add trailing commas intermittently.
## Just pay attention to this.  Also at some point I'll need to make a fringe
## case for handling key/values that aren't included in the default config.
AWS_ID="${AWS_ID:-potato}"
AWS_SECRET="${AWS_SECRET:-potato}"
BUCKET_REGION="${BUCKET_REGION:-potato}"
BUCKET_NAME="${BUCKET_NAME:-potato}"
DB_USER="${DB_USER:-potato}"
DB_PASSWORD="${DB_PASSWORD:-potato}"
DB_HOSTIP="${DB_HOSTIP:-potato}"
DB_PORT="${DB_PORT:-potato}"
DB_NAME="${DB_NAME:-potato}"

## Environment Variables in Array
CONFIG_SETTINGS=(
  AWS_ID
  AWS_SECRET
  BUCKET_REGION
  BUCKET_NAME
  DB_USER
  DB_PASSWORD
  DB_HOSTIP
  DB_PORT
  DB_NAME
)
CONFIG_SECRETS=(
  AWS_ID
  AWS_ID_STR
  AWS_SECRET
  AWS_SECRET_STR
  BUCKET_NAME
  BUCKET_NAME_STR
  DB_USER
  DB_USER_STR
  DB_PASSWORD
  DB_PASSWORD_STR
  DB_HOSTIP
  DB_HOSTIP_STR
  DB_PORT
  DB_PORT_STR
  DB_NAME
  DB_NAME_STR
)

## Sanitization section
# Awaiting someone smarter than me to suggest a method for this.
# https://unix.stackexchange.com/questions/474097/i-want-to-unset-a-list-of-bash-variables-that-have-their-variable-strings-stored
for i in "${CONFIG_SECRETS[@]}"; do
  unset $i
  eval echo \$"${CONFIG_SECRETS[$i]}"=\$${CONFIG_SETTINGS[$i]}
done

답변1

이것은 간단한 루프여야 합니다.

#!/bin/bash

UNSET=(a b c)

a=10 b=20 c=30 d=40 e=50

echo Before a=$a b=$b c=$c d=$d e=$e

for i in ${UNSET[@]}
do
  unset $i
done

echo After a=$a b=$b c=$c d=$d e=$e

이로 인해

Before a=10 b=20 c=30 d=40 e=50
After a= b= c= d=40 e=50

답변2

다음을 사용하여 변수를 역참조할 수 있습니다 !.

$ foo=bar
$ bar=1
$ echo ${!foo}
1

변수를 사용할 수 없습니다~에그러나 이와 같은 확장 기능을 사용하면 정말 보기 흉한 작업을 수행해야 할 수도 있습니다 eval.

답변3

나는 당신이 원 안에 있다고 생각합니다. 배열을 반복하고 순환 참조의 매개 변수를 설정 해제하십시오.

AWS_SECRET='secret_here'
echo Before:
declare -p AWS_SECRET
set|grep AWS_SECRET

for secret in "${CONFIG_SECRETS[@]}"
do
  unset $secret
done

echo After:
declare -p AWS_SECRET
set|grep AWS_SECRET

관련 정보