Bash
我想取消設置將變數字元串儲存在數組中的 bash 變數列表
我正在創建一個 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
.