1. 程式人生 > 其它 >Shell陣列基本概述

Shell陣列基本概述

1. 陣列基本概述

01. 什麼是陣列?

陣列其實也算是變數,傳統的變數只能儲存一個值,但陣列可以儲存多個值。

02. 陣列的分類

Shell陣列分為普通陣列和關聯陣列。

普通陣列:只能使用整數作為陣列索引。

關聯陣列:可以使用字串作為陣列索引。

2. 陣列基本使用

01. 普通陣列僅能使用整數來作為索引

#普通陣列賦值方式

#1.方式一:針對每個索引進行賦值

[root@qiudao ~]# array1[0]=pear
[root@qiudao ~]# array1[1]=apple
[root@qiudao ~]# array1[2]=orange
[root@qiudao ~]# array1[3]=peach

2.方式二:一次賦多個值,陣列名=(多個變數值)

[root@qiudao ~]# array2=(tom jack alice)
[root@qiudao ~]# array3=(tom jack alice "bash shell")
[root@qiudao ~]# array4=(1 2 3 "linux shell" [20]=puppet)

#3.方式三:將該檔案中的每一個列作為一個元數賦值給陣列array5,預設以空格為分割符

[root@qiudao ~]# array5=(`cat /etc/passwd`)

02. 如何檢視普通陣列的賦值與訪問陣列的內容

#1.定義普通陣列,其實也可以不用定義

[root@qiudao ~]# declare -a array

2.統計陣列元數的個數''

[root@qiudao ~]# echo ${#array1[@]}
4

3.訪問陣列中的第一個元素

[root@qiudao ~]# echo ${array1[0]}
pear

4.從陣列索引1開始

[root@qiudao ~]# echo ${array1[@]:1}
apple orange peach

#5.從陣列索引1開始,訪問兩個元素

[root@qiudao ~]# echo ${array1[@]:1:2}
apple orange

6.訪問陣列中所有資料,相當於echo ${array1[*]}

[root@qiudao ~]# echo ${array1[@]}
pear apple orange peach

03. 關聯陣列能使用字串的方式作為索引

關聯陣列賦值

#1.定義關聯陣列, 申明是關聯資料

[root@qiudao ~]# declare -A tt_array_1
[root@qiudao ~]# declare -A tt_array_2

2.方式一:給關聯陣列進行賦值,陣列名[索引]=變數值

[root@qiudao ~]# tt_array1[index1]=pear
[root@qiudao ~]# tt_array1[index2]=apple
[root@qiudao ~]# tt_array1[index3]=orange
[root@qiudao ~]# tt_array1[index4]=peach

3.方式二:給關聯陣列一次賦多個值

[root@qiudao ~]# tt_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')

4.檢視關聯陣列

[root@qiudao ~]# declare -A

04. 如何訪問關聯陣列中的資料。

1.訪問陣列中的第二個元數

[root@qiudao ~]# echo ${tt_array2[index2]}
jack

2.訪問陣列中所有元數

等同於 echo ${array1[*]}

[root@qiudao ~]# echo ${tt_array2[@]}
bash shell tom jack alice

3.訪問陣列中所有元數的索引

[root@qiudao ~]# echo ${!tt_array2[@]}
index4 index1 index2 index3

3. 陣列遍歷與迴圈

方式一:通過陣列元數的個數進行遍歷(不推薦) 。

方式二:通過陣列元數的索引進行遍歷(推薦) 注意: 將統計的物件作為陣列的索引,僅針對關聯資料。

01.普通陣列賦值與遍歷示例

[root@qiudao ~]# cat array-1.sh
#!/usr/bin/bash
#1.使用while讀入一個檔案
while read line
do
    #2.定義普通陣列, 將讀入的每行資料,單個單個進行賦值
    hosts[i++]=$line
    #正常定義普通陣列是hosts[1]=test,只不過我們將[]變成自增
    #$line是讀取的檔案內容
done </etc/hosts
#3.使用for迴圈遍歷陣列, 遍歷陣列的索引
for i in ${!hosts[@]}
do
    echo "hosts陣列對應的索引是:$i, 對應的值是: ${hosts[i]}"
done

02.使用關聯陣列統計檔案中的每個Shell數量

[root@qiudao ~]# cat count_passwd.sh
#!/bin/bash
declare -A array_passwd
#1.對陣列進行賦值
while read line
do
type=$(echo $line|awk -F ':' '{print $NF}')
let array_passwd[$type]++
done </etc/passwd

2.對陣列進行遍歷

for i in ${!array_passwd[@]}
do
echo "Shell: $i count: ${array_passwd[$i]}"
done

\#步驟拆分講解

[root@qiudao ~]# declare -A array_passwd
[root@qiudao ~]# array_passwd=([/bin/bash]=1 [/sbin/nologin]=1)
[root@qiudao ~]# let array_passwd[/bin/bash]++
[root@qiudao ~]# let array_passwd[/sbin/nologin]++
[root@qiudao ~]# echo ${!array_passwd[@]}
/sbin/nologin

nginx log top 10 IP conut

declare -A array_nginx
#1.給關聯陣列的索引進行賦值
while read line
do
    type=$(echo $line|awk '{print $1}')
    let array_nginx[$type]++
done </var/log/nginx/access.log
#2.遍歷陣列
for i in ${!array_nginx[@]}
do
    echo "IP是:$i 出現多少次: ${array_nginx[$i]}"
done

04. 統計tOp的狀態資訊

[root@qiudao ~]# cat array_ss_state.sh
#!/usr/bin/bash
declare -A array_state
type=$(ss -ant |sed '1d' |awk '{print $1}')
#1.對陣列進行的索引賦值
for i in $type
do
    let array_state[$i]++
done
#2                                                                            .遍歷陣列
for j in ${!array_state[@]}
do
    echo "當前的狀態是:$j,當前狀態出現了多少次:${array_state[$j]}"
done