我继承了一个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=foo
和bar
,这导致在其环境中使用key=foo
执行名为bar
的命令。