關於變數的值中包含另一個變數引用的處理-間接變數引用
今天筆者在寫一個指令碼時,遇到了一種技術難點,就是一個變數值的部分內容,引用了另外一個變數,很多地方稱這種技術為間接變數的引用
指令碼實現的部分邏輯為:定義了多個關聯陣列(關聯陣列不支援二維級多維),需要對多個關聯陣列的鍵進行遍歷取值
這樣,筆者在定義多個關聯陣列時,變數的名字就定義的相對規律一些,如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民工!