問題描述
我想知道如何在bash中聲明一個2D數組,然後初始化為0。
在C中,它看起來像這樣:
int a[4][5] = {0};
而且如何為元素賦值?如C:
a[2][3] = 3;
最佳解決方案
您可以使用哈希模擬它們,但需要關注前導零和其他許多事情。下一個演示工作,但它遠非最佳解決方案。
#!/bin/bash
declare -A matrix
num_rows=4
num_columns=5
for ((i=1;i<=num_rows;i++)) do
for ((j=1;j<=num_columns;j++)) do
matrix[$i,$j]=$RANDOM
done
done
f1="%$((${#num_rows}+1))s"
f2=" %9s"
printf "$f1" ''
for ((i=1;i<=num_rows;i++)) do
printf "$f2" $i
done
echo
for ((j=1;j<=num_columns;j++)) do
printf "$f1" $j
for ((i=1;i<=num_rows;i++)) do
printf "$f2" ${matrix[$i,$j]}
done
echo
done
上面的示例創建一個具有隨機數的4×5矩陣並打印出來,並以示例結果
1 2 3 4
1 18006 31193 16110 23297
2 26229 19869 1140 19837
3 8192 2181 25512 2318
4 3269 25516 18701 7977
5 31775 17358 4468 30345
原理是:創建一個關聯數組,其中索引是像 3,4
這樣的字符串。好處:
可以用於any-dimension陣列;)如:
30,40,2
3維。語法接近」C」像陣列
${matrix[2,3]}
次佳解決方案
Bash不支持多維數組。
您可以使用間接擴展來模擬它:
#!/bin/bash
declare -a a0=(1 2 3 4)
declare -a a1=(5 6 7 8)
var="a1[1]"
echo ${!var} # outputs 6
此方法也可以進行分配:
let $var=55
echo ${a1[1]} # outputs 55
編輯1:要從一個文件中讀取這樣一個數組,每一行都在一行上,並且以空格分隔的值,請使用:
idx=0
while read -a a$idx; do
let idx++;
done </tmp/some_file
編輯2:要聲明並初始化 a0..a3[0..4]
到 0
,可以運行:
for i in {0..3}; do
eval "declare -a a$i=( $(for j in {0..4}; do echo 0; done) )"
done
第三種解決方案
Bash沒有multi-dimensional數組。但是您可以使用關聯數組來模擬一些類似的效果。以下是假冒用作multi-dimensional數組的關聯數組的示例:
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),上述將不起作用。例如,如果省略聲明-A arr行,則echo將打印2 3而不是0 1,因為0,0,1,0將被視為算術表達式並被計算為0(右邊的值的逗號運算符)。
第四種方案
你也可以用不那麼聰明的方式來處理這個問題
q=()
q+=( 1-2 )
q+=( a-b )
for set in ${q[@]};
do
echo ${set%%-*}
echo ${set##*-}
done
當然,一個22線解決方案或間接可能是更好的方法,為什麼不在每個地方噴灑eval。
參考文獻
註:本文內容整合自google/baidu/bing輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:gxnotes#qq.com(#替換為@)。