我想知道如何在bash中声明一个2D数组,然后初始化为0。
在C中,它看起来像这样:
int a[4][5] = {0};
那么如何给元素赋值呢?与C中的一样:
a[2][3] = 3;
发布于 2015-07-08 02:30:18
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
(逗号运算符右侧的值)。
发布于 2014-06-25 09:05:34
您也可以用一种不太聪明的方式来实现这一点。
q=()
q+=( 1-2 )
q+=( a-b )
for set in ${q[@]};
do
echo ${set%%-*}
echo ${set##*-}
done
当然,22行的解决方案或间接的解决方案可能是更好的方法,为什么不在每个地方都使用eval。
发布于 2016-03-22 12:03:08
另一种方法是您可以将每一行表示为字符串,即将2D数组映射到1D数组。然后,当您进行编辑时,您需要做的就是对行的字符串进行解包和重新打包:
# 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
输出:
00 01 02 03 04
10 11 12 13 14
20 21 22 9999 24
30 31 32 33 34
https://stackoverflow.com/questions/16487258
复制相似问题