首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在bash中声明二维数组

如何在bash中声明二维数组
EN

Stack Overflow用户
提问于 2013-05-11 00:55:06
回答 10查看 228.9K关注 0票数 86

我想知道如何在bash中声明一个2D数组,然后初始化为0。

在C中,它看起来像这样:

代码语言:javascript
复制
int a[4][5] = {0};

那么如何给元素赋值呢?与C中的一样:

代码语言:javascript
复制
a[2][3] = 3;
EN

回答 10

Stack Overflow用户

发布于 2015-07-08 02:30:18

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

代码语言:javascript
复制
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,01,0等将被视为算术表达式并计算为0 (逗号运算符右侧的值)。

票数 30
EN

Stack Overflow用户

发布于 2014-06-25 09:05:34

您也可以用一种不太聪明的方式来实现这一点。

代码语言:javascript
复制
q=()
q+=( 1-2 )
q+=( a-b )

for set in ${q[@]};
do
echo ${set%%-*}
echo ${set##*-}
done

当然,22行的解决方案或间接的解决方案可能是更好的方法,为什么不在每个地方都使用eval。

票数 5
EN

Stack Overflow用户

发布于 2016-03-22 12:03:08

另一种方法是您可以将每一行表示为字符串,即将2D数组映射到1D数组。然后,当您进行编辑时,您需要做的就是对行的字符串进行解包和重新打包:

代码语言:javascript
复制
# Init a 4x5 matrix
a=("00 01 02 03 04" "10 11 12 13 14" "20 21 22 23 24" "30 31 32 33 34")

aset() {
  row=$1
  col=$2
  value=$3
  IFS=' ' read -r -a tmp <<< "${a[$row]}"
  tmp[$col]=$value
  a[$row]="${tmp[@]}"
}

# Set a[2][3] = 9999
aset 2 3 9999

# Show result
for r in "${a[@]}"; do
  echo $r
done

输出:

代码语言:javascript
复制
00 01 02 03 04
10 11 12 13 14
20 21 22 9999 24
30 31 32 33 34
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16487258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档