2014-10-29 60 views
1

我爬過大量的電路板,但沒有找到我的問題的最終解決方案。Bash,變量和數組

我有一個名爲「array0」的數組,名稱被存儲到一個名爲arrayname的變量中。我也有一個記錄的IP地址,比如說127.0.0.1,也存儲在一個名爲ip的變量中。

現在我想的IP分配給指數3像數組中:

"$arrayname"[3]="$ip"  

所以,這沒有奏效。我嘗試了很多方法來解決這個問題,但都沒有成功。
有誰可以告訴我這種情況下的最終解決方案?

更新:給定的機會來處理這個問題非常好!但我忘了提及我正在使用的數組只是源自另一個文件(也用bash編寫)。我的目標是現在編輯源文件本身的數組。還有什麼想法嗎?

回答

5

嘗試

read ${arrayname}[3] <<<"$ip" 
+2

+1所示我總是忘記你也可以讀入數組的元素。 – chepner 2014-10-29 12:09:14

+1

不錯。我無法決定我是否更喜歡這種'read'方法或chepner的'declare'方法。但兩者都遠遠超出了基於評估的方法。 :) – 2014-10-29 12:20:35

+0

是的,謝謝,這工作很好!現在我的問題,我忘了說:數組存儲在我用source命令訪問的另一個文件中..那裏數組由'declare -a array0'聲明,然後0-2填充爲'array0 = (value0 value1 value2)。如何將值打印到其他文件中的數組中? – dncrft 2014-10-29 12:30:39

-1

初始化數組後,您可以使用它們的索引訪問數組元素,如下所示。 訪問爲:

${arrayname[3]} 
+1

你已經明白了dncrft問? – Jdamian 2014-10-29 12:06:57

+0

@Jdamian是的,我剛纔展示瞭如何訪問數組元素,它被錯誤地訪問,如示例 – 2014-10-29 12:27:49

0

看到這個:

# declare -a arrayname=(element1 element2 element3) 
# echo ${arrayname[0]} 
    element1 
# arrayname[4]="Yellow" 
# echo ${arrayname[4]} 
    Yellow 
# export ip="192.168.190.23" 
# arrayname[5]=$ip 
# echo ${arrayname[5]} 
    192.168.190.23 

您不必使用引號。

+0

這並不回答問題。 – 2014-10-29 13:20:22

2

您需要使用declare命令和間接參數擴展,但使用數組名稱有點棘手。如果將索引視爲變量名稱的部分,而不是應用於數組名稱的運算符(如在大多數語言中那樣),它會有所幫助。

array0=(1 2 3 4 5) 
arrayname=array0 
name=$arrayname[3] 
declare "$name=$ip" 
echo "${!name} 
+0

「聲明」總是一個很好的竅門! – Jdamian 2014-10-29 12:10:09

+1

這是一個很好的訣竅,但是你必須確保'name'的內容是安全的。否則不好的事情可能發生。例如,嘗試使用'name = $ arrayname [3]'替換'name = $ arrayname [$(ls>&2; echo 3)]''代替上面的代碼。它仍然根據需要修改'array0',但它也有不必要的副作用。 :) – 2014-10-29 13:17:34

+1

嗯,這是設置'name'的值而不是'declare'的問題。 – chepner 2014-10-29 14:04:30

2

而又一種方式來做到這一點,這次使用多功能printf

printf -v "$arrayname[3]" %s "$ip" 

演示

#!/bin/bash 

array0=(a b c d e) 
echo "${array0[@]}" 

arrayname='array0' 
ip='127.0.0.1' 

printf -v "$arrayname[3]" %s "$ip" 
echo "${array0[@]}" 

輸出

a b c d e 
a b c 127.0.0.1 e