我刚刚写了一个bash脚本。我有一个配置文件来设置一些变量:
environment_information.conf
SIT_SERVER_IP=xxx.xx.xx.xx
SIT_SERVER_PASSWORD=******
我读取conf文件并尝试使用预定义的键回显
echo $SIT_SERVER_IP
echo $SIT_SERVER_PASSWORD
它没有任何问题,工作正常。在我的场景中,我将在执行shell脚本时读取值。
automation_script.sh
#!/bin/sh
. ./environment_information.conf
environment_name=$1"_SERVER_IP";
# test="${environment_prefix}"; # Error
test="${environment_name}";
echo "$.$test";
echo $SIT_SERVER_IP
我尝试使用输入和一些常量值从conf中获取值:
$ ./automation_script.sh SIT
$.SIT_SERVER_IP
xxx.xx.xx.xx
$
始终打印SIT_SERVER_IP
字符串。
但是我期待来自这个SIT_SERVER_IP
的conf文件的价值。
答案 0 :(得分:3)
我认为你正在寻找间接扩张(Shell parameter expansion的第4段):
test=${!environment_name}
这会扩展为名称保存在$environment_name
。
概念证明脚本,松散地基于您的代码(automation_script.sh
):
: "${1:?}" # Check that a parameter (SIT) was passed.
#. ./environment_information.conf
SIT_SERVER_IP="192.10.29.31" # Surrogate for configuration file
SIT_SERVER_PASSWORD="secret" # Surrogate for configuration file
echo "SIT_SERVER_IP=${SIT_SERVER_IP}"
echo "SIT_SERVER_PASSWORD=${SIT_SERVER_PASSWORD}"
environment_name="${1}_SERVER_IP"
echo "${environment_name}"
echo "${environment_name}=${!environment_name}"
environment_name="${1}_SERVER_PASSWORD"
echo "${environment_name}"
echo "${environment_name}=${!environment_name}"
运行脚本的输出:
$ bash automation_script.sh SIT
SIT_SERVER_IP=192.10.29.31
SIT_SERVER_PASSWORD=secret
SIT_SERVER_IP
SIT_SERVER_IP=192.10.29.31
SIT_SERVER_PASSWORD
SIT_SERVER_PASSWORD=secret
$
使用更新后的问题中的environment_information.conf文件:
: "${1:?}"
. ./environment_information.conf
#SIT_SERVER_IP="192.10.29.31"
#SIT_SERVER_PASSWORD="secret"
echo "SIT_SERVER_IP=${SIT_SERVER_IP}"
echo "SIT_SERVER_PASSWORD=${SIT_SERVER_PASSWORD}"
environment_name="${1}_SERVER_IP"
echo "${environment_name}"
echo "${environment_name}=${!environment_name}"
environment_name="${1}_SERVER_PASSWORD"
echo "${environment_name}"
echo "${environment_name}=${!environment_name}"
运行产生:
$ bash automation_script.sh SIT
SIT_SERVER_IP=xxx.xx.xx.xx
SIT_SERVER_PASSWORD=******
SIT_SERVER_IP
SIT_SERVER_IP=xxx.xx.xx.xx
SIT_SERVER_PASSWORD
SIT_SERVER_PASSWORD=******
$