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