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

eval in shell script - purpose of \${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

这行得通,因为 right-hand 侧不经过 word-splitting;名称 key 将获得值 foo bar.

现在考虑

key=foo
$key=$value

这只是一个错误,因为它不是一个赋值;这是一次尝试,在参数扩展和 word-splitting 之后,运行 带有参数 bar.

的命令名称 foo=foo

使用eval,我们选择让一些扩展发生在之前 eval 运行s,一些发生在之后。有

eval $key=${value}

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

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

eval $key=${value}

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