#!/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")'
答案 0 :(得分:2)
我在这里添加一个警告:您应该真正拆分此结构,因为您尝试做的事情(被告知要做的)是混合两种不同的数据类型。
Bash和ksh93支持有序的数组(带有整数索引)和无序的关联数组(用字符串值键入的映射)。
所以,事情叫做:
包含整数索引和字符串索引的数组
实际上是一个关联数组,带有键的字符串。
更新地图时,您只能按键添加或删除元素。
关联数组经过优化,可以找到任意随机密钥,而数组则可以通过偏移进行优化,并循环索引。用另一个模拟一个将导致更大的复杂性,将更难维护,并将降低性能。
如果您只需要ksh或bash中的有序列表,请使用
typeset -a list=( value1 value2 )
在bash中,您可以将declare
替换为typeset
。在旧版ksh
中你
可能需要使用set -A list value1 value2