偶尔会在shell中想用类似java map或python 字典的数据结构,没有,做个替代的东东吧。
用两个数组分别保存key、value,根据key排序做个索引的数组,查找key对应的value时通过二分查找获得。
数组保存不用写代码,需要一个创建索引的函数、一个通过索引二分查找的函数:
<pre name="code" class="plain">#create exampe:
#a=(d s a f g)
#index=($(createIndex a))
#echo ${index[@]} #result is : 2 0 3 4 1
function createIndex()
{
eval local tmpn=\${#$1[@]}
local tmpi=0
local index=($(for((tmpi=0;tmpi<${tmpn};tmpi++))
do
eval echo -e "\${$1[${tmpi}]}\\\\t${tmpi}\\\\n"
done | sort | awk '{print $2}'))
echo "${index[@]}"
}
#find exampe:
#i=$(findByIndex a index g) #i : 4
#echo ${a[${i}]} #result is : g
#if [[ ${i} =~ -.+ ]]; then echo "not found"; fi
findByIndex()
{
eval local tmpn=\${#$1[@]}
local findvalue="$3"
local findindex=-1
local mini=0
local maxi=${tmpn}
local curi
local curindex
local curvalue
while [[ mini -le maxi ]]
do
curi=$(((mini+maxi)/2))
eval curindex=\${$2[${curi}]}
eval curvalue=\${$1[${curindex}]}
if [[ "${findvalue}" > "${curvalue}" ]]; then
mini=$((${curi}+1))
elif [[ "${findvalue}" < "${curvalue}" ]]; then
maxi=$((${curi}-1))
else
findindex=${curindex}
break
fi
done
echo ${findindex}
}