shell脚本中的eval-\${value}的用途



我继承了一个shell脚本,它有以下代码

while IFS='=' read -r key value
do
# echo "key ${key}"
if [[ ${key} =~ ^# ]]; then
# echo "comment line ${key},  skipping....."
continue
fi
eval ${key}=${value}
echo "key: ${key}, value: ${value}"
done <kafka-parameters.txt

其中kafka-parameters.txt文件包含类似以下的条目

#Schema Registry
DEV_SR_URLS=http://sr1-dev:8081, http://sr2-dev:8081
QA_SR_URLS=http://sr1-qa:8081, http://sr2-qa:8081
STAGE_SR_URLS=http://sr1-qa:8081, http://sr2-qa:8081
PROD_SR_URLS=http://sr1:8081, http://sr2:8081
#
#Bootstrap Servers
DEV_BOOTSTRAP_SERVERS=broker1-dev:9092,broker2-dev:9092,broker3-dev:9092
QA_BOOTSTRAP_SERVERS=broker1-qa:9092,broker2-qa:9092,broker3-qa:9092
STAGE_BOOTSTRAP_SERVERS=broker1-qa:9092,broker2-qa:9092,broker3-qa:9092
PROD_BOOTSTRAP_SERVERS=broker1:9092,broker2:9092,broker3:9092
#

在上面的片段中\"在${value}之前?

根据我的理解,eval ${key}=${value}创建了一个名为${key}的变量,并为其赋值${value},eval使该赋值在循环后可用。

这是正确的吗?仍然不理解\${value}的目的

或者之间有什么区别

eval ${key}=${value}
and
eval ${key}=${value}

考虑以下赋值:

value="foo bar"
key=$value

这是可行的,因为右手边不需要分词;名称CCD_ 2将得到值CCD_。

现在考虑

key=foo
$key=$value

这只是一个错误,因为这不是一项任务;这是一种尝试,在参数扩展和分词之后,运行带有参数bar的命令名foo=foo

使用eval,我们选择在运行eval之前进行一些扩展,并在运行之后进行一些扩展。带

eval $key=${value}

eval将看到字符串foo=${value},它将通过扩展$value}并将整个结果分配给foo来执行该字符串,类似于上面的第一个示例。

但是,如果让两个参数首先展开,

eval $key=${value}

然后在参数扩展后,eval得到两个参数key=foobar,这导致在其环境中使用key=foo执行名为bar的命令。

相关内容

  • 没有找到相关文章

最新更新