我繼承了一個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}
謝謝
uj5u.com熱心網友回復:
考慮以下分配:
value="foo bar"
key=$value
這會起作用,因為右側不會進行分詞;名稱key將獲得價值foo bar。
現在考慮
key=foo
$key=$value
這只是一個錯誤,因為它不是分配;這是一種嘗試,在引數擴展和分詞之后,運行foo=foo帶有引數的命令名稱bar。
使用eval,我們選擇讓一些擴展在運行之前發生, eval而一些在之后發生。和
eval $key=\${value}
eval將看到字串foo=${value},它將通過擴展$value}并將整個結果分配給來執行該字串,foo類似于上面的第一個示例。
但是,如果讓兩個引數先展開,
eval $key=${value}
然后在引數擴展后eval得到兩個引數,key=foo和bar,這導致在其環境bar中執行名為的命令。key=foo
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436712.html
