茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672329 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00030.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [轉貼]在 bash 中,如何聲明二維數組

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]在 bash 中,如何聲明二維數組

在bash中,如何聲明二維數組

問題描述

我想知道如何在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(#替換為@)。


原文出處:在bash中,如何声明二维数组 - 共享笔记
前一個主題 | 下一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|