1. 程式人生 > 其它 >關於變數的值中包含另一個變數引用的處理-間接變數引用

關於變數的值中包含另一個變數引用的處理-間接變數引用

今天筆者在寫一個指令碼時,遇到了一種技術難點,就是一個變數值的部分內容,引用了另外一個變數,很多地方稱這種技術為間接變數的引用

指令碼實現的部分邏輯為:定義了多個關聯陣列(關聯陣列不支援二維級多維),需要對多個關聯陣列的鍵進行遍歷取值

這樣,筆者在定義多個關聯陣列時,變數的名字就定義的相對規律一些,如server_01 、server_02

在使用for遍歷時,需要先得到這些關聯陣列,然後再取它的固定的鍵的值,筆者最開始使用如下方法:

#!/bin/bash
#

declare -A server_01 server_02

server_01[instance_id]=i-0c2f35d32afcadd5b
server_01[user]
=qq_5201351 server_02[instance_id]=i-0323eabc546829ead server_02[user]=qq_5201351 for server in server_{01..02};do instance_id=${$server[instance_id]} user=${$server["user"]} echo $instance_id $user done

這樣執行時,就會直接報錯:xxx.sh: line 13: ${$server[instance_id]}: bad substitution

解決方法:對於關聯陣列這種場景,筆者能想到的只有如下一種使用eval的方法:

#!/bin/bash
#

declare -A server_01 server_02

server_01[instance_id]=i-0c2f35d32afcadd5b
server_01[user]=qq_5201351

server_02[instance_id]=i-0323eabc546829ead
server_02[user]=qq_5201351

for server in server_{01..02};do
     eval instance_id=\${$server[instance_id]}
     eval user=\${$server["user"]}
     echo $instance_id $user
done

執行結果,就是正常的,我們想要得到的結果

i-0c2f35d32afcadd5b qq_5201351
i-0323eabc546829ead qq_5201351

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

補充,對於普通的變數,還有一種方式,是可以通過${!var}進行間接變數取值,效果如下:

var=name
name=admin
echo ${!var}

這樣也可以通過var變數得到name變數的值,最終輸出admin,但是這樣方式,不合適上面案例中的關聯陣列的場景

尊重別人的勞動成果 轉載請務必註明出處:https://www.cnblogs.com/5201351/p/15587703.html

作者:一名卑微的IT民工

出處:https://www.cnblogs.com/5201351

本部落格所有文章僅用於學習、研究和交流目的,歡迎非商業性質轉載。

博主的文章沒有高度、深度和廣度,只是湊字數。由於博主的水平不高,不足和錯誤之處在所難免,希望大家能夠批評指出。

博主是利用讀書、參考、引用、抄襲、複製和貼上等多種方式打造成自己的文章,請原諒博主成為一個卑微的IT民工!