【问题标题】:eval in shell script - purpose of \${value}shell 脚本中的 eval - \\${value} 的用途
【发布时间】:2022-10-25 00:07:06
【问题描述】:

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

在上面的 sn-p 中,${value} 前面的 "\" 的目的是什么?

据我了解,eval ${key}=${value} 创建了一个名为 ${key} 的变量并将 ${value} 的值分配给它,并且 eval 使该分配在循环后可用。

这个对吗?还是不明白 \${value} 的用途

或者有什么区别

eval ${key}=\${value}

and

eval ${key}=${value}

【问题讨论】:

  • 当涉及到 eval 时,通常需要这样的代码。 \${value} 延迟 ${value} 的评估,直到运行 eval 语句。如果没有反斜杠,$value 将在整个脚本中具有一个常量值,在读取脚本时设置。使用反斜杠,在执行 eval 时扩展 ${value}。
  • 那么,这个 bash 是否等同于延迟扩展在 Windows 批处理脚本中的工作方式?似乎是这样。

标签: shell eval readfile


【解决方案1】:

考虑以下分配:

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 来执行,类似于上面的第一个示例。

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

eval $key=${value}

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

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多