如果数组中的整数索引元素,Bash获取数字

时间:2014-04-23 07:56:23

标签: arrays bash

#!/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)

编辑...临时解决方案基于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] =" Some Text" [0] =" someVal1" [1] =" someVal2" [2] =" someVal3")'

1 个答案:

答案 0 :(得分:2)

我在这里添加一个警告:您应该真正拆分此结构,因为您尝试做的事情(被告知要做的)是混合两种不同的数据类型。

Bash和ksh93支持有序的数组(带有整数索引)和无序的关联数组(用字符串值键入的映射)。

所以,事情叫做:

  

包含整数索引和字符串索引的数组

实际上是一个关联数组,带有键的字符串。

更新地图时,您只能按键添加或删除元素。

关联数组经过优化,可以找到任意随机密钥,而数组则可以通过偏移进行优化,并循环索引。用另一个模拟一个将导致更大的复杂性,将更难维护,并将降低性能。


如果您只需要ksh或bash中的有序列表,请使用

typeset -a list=( value1 value2 )

在bash中,您可以将declare替换为typeset。在旧版ksh中你 可能需要使用set -A list value1 value2