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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00041.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中,如何声明二维数组 - 共享笔记
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]shell 腳本之模擬二維數組
shell腳本之模擬二維數組

   在shell腳本裡面,bash雖然對數組元素個數沒有限制,但其只支持一維數組。不過可以使用一些小技巧來模擬二維數組。其實二維數組在本質上等同於一維數組,只不過增加了使用行和列的未知來引用和操作元素的尋址模式。下面我通過幾個簡單列子演示一下。

實驗一:


#!/bin/bash
#
#初始化定義三個數組
arry1=(A B C)
arry2=(D E F)
arry3=(G H I)
#
#使用for循環來讀取數組中元素的個數,每次讀取完一個數組將其打印到屏幕上並繼續讀取
for ((i=0;i<4;i++))
do
eval value=\${arry${i}[@]}
for element in ${value}
do
echo -e ${value}
continue 2
done
done
echo
exit 0

運行結果:

wKioL1MhdbaAH0KoAACa-pjMqbg050.jpg

實驗二:


#!/bin/bash
#
#定義三個一維數組
array1="A B C"
array2="D E F"
array3="G H I"
#
#使用for語句來循環讀取所定義的數組中的元素並暫存到變量i中
#將暫存在變量i中的元素賦予變量value
#使用for語句讀取變量value中的值 每次讀取完後都打印到標準輸出直到讀取完成
for i in array1 array2 array3
do
eval value=\$$i
for j in $value
do
echo -e $value
continue 2
done
done
echo
exit 0

運行結果:

wKioL1MheMCR_nJ-AACK1l9-5s4062.jpg

試驗三(使用函數來實現模擬二維數組):


#!/bin/bash
#
#初始化第一個數組
array2=(
element2
element3
element4
)
#初始化第二個數組
array3=(
element5 element6 element7
)
#定義一個函數 將所定義的兩個一維數組組合成一個二維數組並顯示到屏幕上
ARRAY()
{
echo
echo ">>Two-dimensional array<<"
echo
echo "${array2[*]}"
echo "${array3[*]}"
}
#
ARRAY
echo
exit 0

運行結果:

wKioL1MhevqTAd47AADvvMx0eTk136.jpg

實驗四(使用循環來模擬):


#!/bin/bash
#
declare -i j=0
declare -i limit=4
#
#初始化一個一維數組
array=(34 35 36 37 38 39)
#
echo "Two-dimensional array"
#使用while循環完成對一維數組元素的讀取 並將讀取的元素重新組成一個二維數組後輸出
while [ $j -lt $limit ]
do
#對數組array中的元素每次都從第$j個元素開始讀取且讀取的數目為3
echo "${array[*]:$j:3}"
let j+=2
let j++
done
echo
exit 0

運行結果:

wKiom1MhfTKhniIDAAC4a7P3S1o022.jpg

以上就是我模擬的幾個列子 還請多多指教 w_0014.gif




本文出自 「 淒淒秋如夜 殘雪舞指間」 博客,請務必保留此出處 http://0101x.blog.51cto.com/8639108/1375848


原文出處:shell脚本之模拟二维数组 - 凄凄秋如夜 残雪舞指间 - 51CTO技术博客
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]bash 下 array 的幾種使用方法

bash下array的幾種使用方法

#!/bin/bash
#一舉將變數設定到陣列中
array=(Redhat Novell MicroSoft Sun IBM HP Dell)

#利用for loop將陣列中的變數印出
for i in 0 1 2 3 4 5 6
do
echo "array[$i]=${array[$i]}"
done

#設定間隔符號為: 搭配$*將陣列的值一口氣輸出
IFS=:
echo "${array[*]}"

#設定間隔符號為換行,搭配$*將陣列的值一口氣輸出
IFS=$'\n'
echo "${array[*]}"

#將陣列中的值利用$@一口氣輸出與$*不同的是,不會將值合併成單一字串
echo "${array[@]}"

#印出陣列中有幾筆資料
echo "${#array[@]}"

執行結果:
array[0]=Redhat
array[1]=Novell
array[2]=MicroSoft
array[3]=Sun
array[4]=IBM
array[5]=HP
array[6]=Dell
Redhat:Novell:MicroSoft:Sun:IBM:HP:Dell
Redhat
Novell
MicroSoft
Sun
IBM
HP
Dell
Redhat Novell MicroSoft Sun IBM HP Dell
7

原文出處:瘋狂帽客's Blog: bash下array的幾種使用方法
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Shell Script: Array

Shell Script: Array

基本上BASH 只提供一維陣列,要二維的話…

直接進入正題:

  1. 宣告陣列


  2. name=(amy willy ashely lunpin alan)
    echo "name[0] is :${name[0]}"
    echo "name[1] is :${name[1]}"
    echo "name[2] is :${name[2]}"
    echo "name[3] is :${name[3]}"
    echo "name[4] is :${name[4]}"
        程式輸出

    name[0] is :amy
    name[1] is :willy
    name[2] is :ashely
    name[3] is :lunpin
    name[4] is :alan

  3. 使用萬用字*/@ 來輸出陣列的所有item


  4. name=(amy willy ashely lunpin alan)
    echo "name list have { ${name[@]} }"
    echo "name list have { ${name[*]} }"
        程式輸出

    name list have { amy willy ashely lunpin alan }
    name list have { amy willy ashely lunpin alan }

  5. 待續


原文出處:Arfak 的技術手札: 十一月 2012
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Shell Script: 陣列 (array)
陣列 (array)

Bash shell 有提供一維陣列的功能
A[0]=1
A[1]=2
A[2]=3

echo "${A[0]} , ${A[1]} , ${A[2]}"

=======

上式也可以一次設定:
A=(1 2 3)

echo "${A[0]} , ${A[1]} , ${A[2]}"

結果是一樣的!

========

也可用字串當 陣列 的索引:
A["bash"]="Hello World"

echo ${A["bash"]}

結果出現 Hello World

原文出處:陣列 (array)
前一個主題 | 下一個主題 | 頁首 | | |



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