2014-04-23 32 views
1
#!/bin/bash 

比方說你有兩個整數索引和索引的字符串,像這樣的數組...猛砸拿到號碼,如果在整數數組索引元素

編輯...注意:此塊將在環在我的應用

declare -A arr 
arr[${#arr[@]}]=someVal1 
arr[${#arr[@]}]=someVal2 
arr[someBool]=true 
arr[someOtherString]="Some Text" 
arr[${#arr[@]}]=someVal3 

現在可以說,我想比較出於某種原因數組項數...

[ "${#arr[@]}" = 5 ] && echo "there are 5 array items"; 

輸出...

there are 5 array items 

確定多數民衆贊成好,但讓我們來看看我們的陣列

declare -p arr 

exit 

輸出...

declare -A arr='([someBool]="true" [someOtherString]="Some Text" 
[0]="someVal1" [1]="someVal2" [4]="someVal3")' 

注意整數索引去0 ,1,4

所以我的問題是應該取代什麼

arr[${#arr[@]}]= 

這樣整數數組索引能正常工作嗎? (0,1,2)

編輯... Temp解決方案基於Henk Langeveld的輸入... Temp,因爲它應該能夠編輯傳遞給它的數組,而不僅僅是靜態編輯全局數組。

#!/bin/bash 
getArrIntIndexNum(){ 
    local x=0 
    for i in "${!arr[@]}"; do 
     [[ $i =~ ^-?[0-9]+$ ]] && x=$((x+1)) 
    done 
    echo $x 
} 

declare -A arr 
arr[$(getArrIntIndexNum)]=someVal1 
arr[$(getArrIntIndexNum)]=someVal2 
arr[someBool]=true 
arr[someOtherString]="Some Text" 
arr[$(getArrIntIndexNum)]=someVal3 

declare -p arr 

輸出...

聲明-A ARR ='([someBool] = 「TRUE」[someOtherString] = 「一些文本」[0] = 「someVal1」[1] =「someVal2 「[2] =」someVal3「)'

+0

我稍微修改了'declare -p'輸出,就好像有一個右邊距。結果仍然可以被bash解釋。 –

回答

2

我在這裏添加一個警告:你應該真的拆分這個結構,因爲你試圖做的(被告知要做的)是混合兩種不同的數據類型。

擊和ksh93的同時支持有序陣列(一個整數指數)和無序陣列(映射字符串值鍵控)。

所以,所謂的東西:

與兩個整數索引和字符串指標

的數組實際上是一個關聯數組,與鑰匙串。

更新地圖時,只能通過鍵添加或移除元素。

關聯數組經過優化,可以找到任何隨機鍵,而數組則針對偏移量進行優化,並循環遍歷索引。與另一方相互作用會導致更大的複雜性,更難維護,並會降低性能。


當所有你需要的是在任何KSH或bash的有序列表,使用

typeset -a list=(value1 value2) 

在bash,你可以爲typeset替代declare。在舊版本的ksh中你可能需要使用set -A list value1 value2

+0

因此,如果鍵是整數,我將不得不循環鍵入變量var? – snowkiterdude

+0

不知道什麼意思*罪證*,但我認爲你已經有了主意。但是,如果您需要計算事物,則可能需要維護一個單獨的列表。 –

+0

opps錯字...像x = $ x + 1遞增; ...好的,謝謝你的幫助! – snowkiterdude