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

zc0qhyus  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(105)

我继承了一个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}
bvk5enib

bvk5enib1#

请考虑下列指派:

value="foo bar"
key=$value

这是可行的,因为右边没有进行分词;名称key将获得值foo bar
现在考虑一下

key=foo
$key=$value

这只是一个错误,因为它不是一个赋值;在参数扩展和单词拆分之后,尝试运行带有参数bar命令foo=foo
使用eval,我们选择让一些扩展在eval运行 * 之前发生,而一些扩展在运行 * 之后发生。

eval $key=\${value}

eval将看到字符串foo=${value},它将通过展开$value}并将整个结果赋给foo来执行该字符串,类似于上面的第一个示例。
但是,如果让 both 参数先展开,

eval $key=${value}

则在参数扩展之后,x1M10 N1 x得到 * 两个 * 自变量,x1M11 N1 x和x1M12 N1 x,这导致名为x1M13 N1 x的命令在其环境中与x1M14 N1 x一起执行。

相关问题