Bash

我想取消設置將變數字元串儲存在數組中的 bash 變數列表

  • April 15, 2019

我正在創建一個 Dockerfile,它呼叫一個名為我start.sh想要獲取從使用者傳遞的環境變數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

這應該是一個簡單的循環

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

您可以取消引用變數!

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

但是,您不能這樣的擴展中使用變數,因此您可能不得不對eval.

引用自:https://unix.stackexchange.com/questions/474097