Desejo desfazer uma lista de variáveis bash que têm suas cadeias de variáveis armazenadas em uma matriz

0

Estou trabalhando na criação de um Dockerfile que chama um script chamado start.sh . Eu quero pegar as variáveis de ambiente que são passadas do usuário por meio de docker-compose.yml ou docker run -e agora o que eu queria fazer é algo em que tenho uma lista dessas variáveis definidas dinamicamente em uma matriz.

## 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
)

Eu só tenho que cancelar um subconjunto das variáveis acima definidas neste array.

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
)

Então, o que estou batendo na minha cabeça, nenhum trocadilho é o seguinte para o loop.

## 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

Por exemplo, o abaixo é um loop for que criei para percorrer essas variáveis e defini-las.

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

Isso modifica o seguinte arquivo de configuração.

{
  "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": ""
}

O script de contexto completo menos as coisas que estão fora do escopo desta questão.

#!/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
    
por chamunks 09.10.2018 / 01:48

3 respostas

1

Isso deve ser um simples loop

#!/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

Isso resulta em

Before a=10 b=20 c=30 d=40 e=50
After a= b= c= d=40 e=50
    
por 09.10.2018 / 02:36
0

Você pode excluir as variáveis com ! :

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

Você não pode usar uma variável dentro de uma expansão como essa, então você provavelmente terá que fazer algo realmente feio com eval .

    
por 09.10.2018 / 01:53
0

Eu acho que você trabalhou em um círculo; simplesmente percorra a matriz e desmarque o parâmetro referido pelo loop:

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
    
por 09.10.2018 / 02:35