簡體   English   中英

從bash腳本中的其他變量聲明中導出帶有變量名和值的命令

[英]export command with variable name and value from other variable declaration in bash script

我正在編寫一個 bash 腳本以從 json 文本格式的 AWS 系統參數參數存儲中讀取配置,然后導出到 linux 環境變量。

總之,我有以下幾點:

name='COMPANY_NAME'
value='System Manager'

command = "$name=$value"
echo $command
export $command

在獲取腳本並嘗試訪問 var 后

echo $COMPANY_NAME # output System instead of System Manager

它將輸出打印為System而不是System Manager 我知道上述可能是由空白引起的。

如何轉義上述導出命令中的空格和其他特殊字符?

下面我還附上了我的源腳本作為參考。

 #!/usr/bin/env bash ## to update the main process with >> . file_name ##function definition process_json(){ #$1: json string #$2: indicee #$3: env name json=$1 i=$2 app_env=$3 element_name=$(echo $json | jq -r ".Parameters[$i].Name") element_value=$(echo $json | jq -r ".Parameters[$i].Value") env_var_name=$(variable_name "$element_name" "$app_env") command="export $env_var_name=$element_value" echo $command export $env_var_name=$element_value } variable_name(){ var_name=$1 # "/app_env/name" come with double quote app_env=$2 app_env_path="/$app_env/" app_env_path_length=${#app_env_path} env_var_name="${var_name:($app_env_path_length)}" echo $env_var_name } console_log(){ display_log=1 if [ $display_log -eq 1 ] then echo $@ fi } fetch_config(){ app_env=$1 json_str=" { \\"Parameters\\": [ { \\"Name\\": \\"/$app_env/APP_NAME\\", \\"Type\\": \\"String\\", \\"Value\\": \\"BookMeBus\\" }, { \\"Name\\": \\"/$app_env/APP_VERSION\\", \\"Type\\": \\"String\\", \\"Value\\": \\"StgVersion\\" }, { \\"Name\\": \\"/$app_env/COMPANY_NAME\\", \\"Type\\": \\"String\\", \\"Value\\": \\"System Manager\\" }, { \\"Name\\": \\"/$app_env/ERROR_NOTIFICATION\\", \\"Type\\": \\"String\\", \\"Value\\": \\"no\\" }, { \\"Name\\": \\"/$app_env/SLACK_CHANNEL\\", \\"Type\\": \\"String\\", \\"Value\\": \\"#error-staging\\" }, { \\"Name\\": \\"/$app_env/SLACK_WEB_HOOK\\", \\"Type\\": \\"String\\", \\"Value\\": \\"https://hooks.slack.com/services/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\\" } ] } " # command_load_params="aws --region=ap-southeast-1 ssm get-parameters-by-path --path /$app_env" # echo $command_load_params # json_str=$($command_load_params) echo $json_str } if [[ -z "${APP_ENV}" ]]; then error="ENV['APP_ENV'] must be set " echo $error exit 1 elif [[ $APP_ENV != "staging" && $APP_ENV != "production" ]]; then error="ENV['APP_ENV'] must be staging or production" exit 1 fi app_env=$APP_ENV json=$(fetch_config "$app_env") # console_log "json is: $json" # echo requires # console_log $json | jq '.Parameters' # console_log $json | jq '[.Parameters[] | {Name: .Name, Value: .Value}] ' length=$(echo $json | jq '.Parameters | length') # console_log "length=$length" i=0 while [ $i -lt $length ] do # Passing variables to a function quote is required surround variable name process_json "$json" "$i" "$app_env" ((i++)) done

下面是我的腳本的輸出:

在此處輸入圖片說明

它的export command沒有 $; 否則,您將導出變量的值,而不是變量(名稱)本身。

https://ss64.com/bash/export.html

你會想要雙引號你的變量(特別是在這種情況下導出):

name="COMPANY_NAME"
value="System Manager"

command=$name=$value

echo "$command"
export "${command?}" # ${var?} silences warning

然后當你獲取它時:

$ source script.sh
$ echo "$COMPANY_NAME"
System Manager

https://github.com/koalaman/shellcheck/wiki/SC2163

嘗試如下:

name='COMPANY_NAME'
value='System Manager'

command="$name=$value"
echo $command
export "$command"

注意第三個和最后一個語句的變化(重要)
說明:未加引號的擴展將空格視為要分隔的標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM