手機版
你好,游客 登錄 注冊
背景:
閱讀新聞

Bash腳本編程之數組

[日期:2020-01-06] 來源:Linux社區  作者:alongdidi [字體: ]

數組簡介

在bash腳本編程當中,變量是存儲單個元素的內存空間;而數組是存儲多個元素的一段連續的內存空間。

數組由數組名和下標構成,如下。

ARRAY_NAME[SUBSCRIPT]

數組按照下標的類型可分為兩種:

  • 索引(indexed)數組:下標為0、1、2等非負整數。
  • 關聯(associative)數組:下標為用戶自定義的字符串。

數組的操作

聲明

索引數組可以不聲明直接使用;而關聯數組如果不聲明直接使用的話,會被認為是索引數組,即使它的下標是字符串。

索引數組的聲明方式。

# declare -a ARRAY_NAME

關聯數組的聲明方式。

# declare -A ARRAY_NAME

賦值

一次只賦值一個元素。

# ARRAY_NAME[SUBSCRIPT]=VALUE

一次賦值全部元素。

# ARRAY_NAME = ("VAL1" "VAL2" "VAL3" ...)

一次賦值多個可以是不連續的元素。

# ARRAY_NAME = ([0] = "VAL1" [3] = "VAL3")

像這種不要求元素必須依次存在的數組(即可以在沒有A[1]和A[2]的時候就賦值A[3]),叫做稀疏格式數組。因此,bash支持稀疏格式的數組。

讀取標準輸入賦值數組。

# read -a ARRAY_NAME

在輸入的時候,以空格作為元素的分隔符,以回車鍵結束元素的賦值。

向數組的末尾追加元素。

ARRAY_NAME[${#ARRAY_NAME[@]}]=VALUE 

或者

ARRAY_NAME+=(VALUE)

引用

引用單個數組元素。

${ARRAY_NAME[SUBSCRIPT]}

如果省略SUBSCRIPT,那么就等同于SUBSCRIPT=0。即以下兩個引用是相同的。

${ARRAY_NAME[0]}
${ARRAY_NAME}

引用數組的所有元素。正常情況下,二者沒有區別,只有當被雙引號包裹的時候,“@”被展開為每個元素為一個獨立的單詞;“*”被展開為所有元素為一個統一的單詞。

${ARRAY_NAME[@]}
${ARRAY_NAME[*]}

引用數組元素的長度。

${#ARRAY_NAME[SUBSCRIPT]}

引用數組的長度,即數組的元素個數。

${#ARRAY_NAME[@]}
${#ARRAY_NAME[*]}

引用數組的部分元素(切片)。

${ARRAY_NAME[@]:OFFSET:NUMBER}
${ARRAY_NAME[*]:OFFSET:NUMBER}

OFFSET:偏移,表示偏移/跳過數組中的前幾個元素。

NUMBER:表示偏移后取幾個元素。

如果省略了NUMBER,并且OFFSET的值為“ -n”(注意,-n的左邊有空格),則表示引用倒數的幾個元素。

截止目前我們引用的都是數組的值,如果我們想引用數組的下標的話,可以使用:

${!ARRAY_NAME[@]}
${!ARRAY_NAME[*]}

刪除

刪除數組元素。

# unset ARRAY_NAME[SUBSCRIPT]

刪除數組。

# unset ARRAY_NAME

數組示例

定義一個索引數組,逐一賦值數組元素。

[[email protected] ~]# declare -a my_array
[[email protected]-server ~]# my_array[0]=zhang
[[email protected]-server ~]# my_array[1]=wen
[[email protected]-server ~]# my_array[2]=long

根據數組下標獲取數組元素。留意我們上文說的,當引用數組不帶下標的時候,等同于引用${ARRAY_NAME[0]}。

[[email protected] ~]# echo ${my_array}
zhang
[[email protected]-server ~]# echo ${my_array[0]}
zhang
[[email protected]-server ~]# echo ${my_array[1]}
wen
[[email protected]-server ~]# echo ${my_array[2]}

引用數組中的所有元素,順便測試一下“@”和“*”的區別。注意,這個區別,僅在${my_array[@]}或者${my_array[*]}被雙引號包裹的情況下才會出現。

[[email protected] ~]# echo ${my_array[@]}
zhang wen long
[[email protected]-server ~]# echo ${my_array[*]}
zhang wen long
[[email protected]-server ~]# for i in "${my_array[@]}"; do echo $i; done
zhang
wen
long
[[email protected]-server ~]# for i in "${my_array[*]}"; do echo $i; done
zhang wen long

引用數組個數。

[[email protected] ~]# echo ${#my_array[@]}
3
[[email protected]-server ~]# echo ${#my_array[*]}
3

引用數組中元素的個數。

[[email protected] ~]# echo ${my_array[0]}
zhang
[[email protected]-server ~]# echo ${#my_array[0]}
5

接下來演示其他幾種不同的賦值方式,操作前可先刪除數組。

[[email protected] ~]# unset my_array
[[email protected]-server ~]# my_array=([0]=zhang [1]=wen [2]=long)
[[email protected]-server ~]# echo ${my_array[@]}
zhang wen long
[[email protected]-server ~]# unset my_array
[[email protected]-server ~]# read -a my_array
Mon Tue Wed Thu Fri Sat Sun
[[email protected]-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun

數組元素去子串(substring),即切片。

[[email protected] ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun
[[email protected]-server ~]# echo ${my_array[@]:3:2}
Thu Fri
[[email protected]-server ~]# echo ${my_array[@]:2:3}
Wed Thu Fri
[[email protected]-server ~]# echo ${my_array[@]: -3}
Fri Sat Sun

數組元素追加。

[[email protected] ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun
[[email protected]-server ~]# my_array+=(ddd)
[[email protected]-server ~]# my_array[${#my_array[@]}]=eee
[[email protected]-server ~]# echo ${my_array[@]}
Mon Tue Wed Thu Fri Sat Sun ddd eee

引用數組的下標(subscript)。個人感覺引用數組下標在關聯數組中比較有用,在索引數組中用處不大。

[[email protected] ~]# echo ${!my_array[@]}
0 1 2 3 4 5 6 7 8
[[email protected]-server ~]# unset my_array
[[email protected]-server ~]# declare -A my_array
[[email protected]-server ~]# my_array=([name]=zwl [age]=28 [sex]=male)
[[email protected]-server ~]# echo ${my_array[@]}
zwl 28 male
[[email protected]-server ~]# echo ${!my_array[@]}
name age sex

練習題

題一:生成10個隨機數并輸出,然后輸出其中的最大值和最小值。

題二:生成10個隨機數并輸出,然后將其由小到大進行排序。

題三:??義一個數組,數組元素為/var/log/目錄下所有以.log結尾的文件的文件名;統計下標為偶數的文件的行數并求和。

linux
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數

       

評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
彩票投注骗局