从bash脚本中的其他变量声明中导出具有变量名称和值的命令

时间:2019-07-07 09:19:44

标签: linux bash shell

我正在编写一个bash脚本,以json文本格式从AWS System参数参数存储中读取配置,然后导出到linux环境变量。

总而言之,我有以下内容:

name='COMPANY_NAME'
value='System Manager'

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

获取脚本并尝试访问var后

echo $COMPANY_NAME # output System instead of System Manager

将输出打印为系统,而不是系统管理器。 我知道以上情况可能是由空白引起的。

如何在上面的 export 命令中转义空格和其他特殊字符?

下面,我还将源脚本附加为参考。

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

下面是我的脚本的输出:

enter image description here

3 个答案:

答案 0 :(得分:0)

它是export command 没有$;否则,您将导出变量的值,而不是变量(名称)本身。

请参见https://ss64.com/bash/export.html

答案 1 :(得分:0)

您需要对变量加双引号(特别是在这种情况下,使用export):

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

答案 2 :(得分:0)

请尝试以下操作:

name='COMPANY_NAME'
value='System Manager'

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

请注意第三和最后一条语句的更改(重要)
说明:无引号的扩展将空格视为要分隔的标记。