为了账号安全,请及时绑定邮箱和手机立即绑定

Bash中的多维数组

/ 猿问

Bash中的多维数组

缥缈止盈 2019-11-29 09:38:54

我正在计划一个脚本来管理我的Linux系统的某些部分,并决定要使用bash还是python。


我宁愿将其作为Bash脚本来执行,仅仅是因为命令更简单,但真正的决定因素是配置。我需要能够在配置文件中存储多维数组,以告诉脚本如何处理自身。使用bash将简单的key = value对存储在配置文件中非常容易,但是我能想到的做多维数组的唯一方法是两层解析引擎,例如


array=&d1|v1;v2;v3&d2|v1;v2;v3

但是marshall / unmarshall代码可能会变得很笨拙,并且对于下一个必须执行此操作的较差的树液而言,它与用户友好相去甚远。如果我不能在bash中轻松做到这一点,我将简单地将配置写入xml文件,然后用python编写脚本。


有什么简单的方法可以做到这一点吗?


感谢大家。


查看完整描述

3 回答

?
MMTTMM

Bash没有多维数组。但是您可以使用关联数组模拟某种类似的效果。下面是一个伪装为多维数组的关联数组的示例:


declare -A arr

arr[0,0]=0

arr[0,1]=1

arr[1,0]=2

arr[1,1]=3

echo "${arr[0,0]} ${arr[0,1]}" # will print 0 1

如果您未将数组声明为关联的(带有-A),则上述方法将无效。例如,如果省略declare -A arr路线,echo将打印2 3的代替0 1,因为0,0,1,0并且这样将作为算术表达式和评价0(数值以逗号运算符的右侧)。


查看完整回答
反对 回复 2019-11-29
?
LEATH

这对我有用。


# Define each array and then add it to the main one

SUB_0=("name0" "value0")

SUB_1=("name1" "value1")

MAIN_ARRAY=(

  SUB_0[@]

  SUB_1[@]

)


# Loop and print it.  Using offset and length to extract values

COUNT=${#MAIN_ARRAY[@]}

for ((i=0; i<$COUNT; i++))

do

  NAME=${!MAIN_ARRAY[i]:0:1}

  VALUE=${!MAIN_ARRAY[i]:1:1}

  echo "NAME ${NAME}"

  echo "VALUE ${VALUE}"

done


查看完整回答
反对 回复 2019-11-29
?
冉冉说

Bash不支持多维数组,也不支持哈希,并且似乎您想要一个哈希值即数组。这个解决方案不是很漂亮,带有xml文件的解决方案应该更好:


array=('d1=(v1 v2 v3)' 'd2=(v1 v2 v3)')

for elt in "${array[@]}";do eval $elt;done

echo "d1 ${#d1[@]} ${d1[@]}"

echo "d2 ${#d2[@]} ${d2[@]}"


查看完整回答
反对 回复 2019-11-29

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信