我正在编写一个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
下面是我的脚本的输出:
答案 0 :(得分:0)
它是export command
没有$;否则,您将导出变量的值,而不是变量(名称)本身。
答案 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
答案 2 :(得分:0)
请尝试以下操作:
name='COMPANY_NAME'
value='System Manager'
command="$name=$value"
echo $command
export "$command"
请注意第三和最后一条语句的更改(重要)
说明:无引号的扩展将空格视为要分隔的标记。