shell 數組

1.什麼是數組

數組其實也算是變量,傳統的變量只能存儲一個值,但數組能夠存儲多個值linux

2.數組的分類

普通數組:只能使用整數,做爲數組索引nginx

關聯數組:只能使用字符串,做爲數組索引
img
imgshell

2. 數組基本使用

01. 普通數組僅能使用整數來做爲索引數組

#普通數組賦值方式bash

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

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

2.方式二:一次賦多個值,數組名=(多個變量值)tcp

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

3.方式三:將該文件中的每個列做爲一個元數賦值給數組array5,默認以空格爲分割符3d

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

02. 如何查看普通數組的賦值與訪問數組的內容日誌

1.定義普通數組,其實也能夠不用定義code

[root@gjy ~]# declare -a array

2.統計數組元數的個數

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

3.訪問數組中的第一個元素

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

4.從數組索引1開始

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

5.從數組索引1開始,訪問兩個元素

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

6.訪問數組中全部數據,至關於echo ${array1[*]}

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

03. 關聯數組能使用字符串的方式做爲索引

關聯數組賦值

1.定義關聯數組, 申明是關聯數據

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

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

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

3.方式二:給關聯數組一次賦多個值

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

4.查看關聯數組

[root@gjy ~]# declare -A

04. 如何訪問關聯數組中的數據。

#1.訪問數組中的第二個元數
[root@gjy ~]# echo ${tt_array2[index2]}
jack
#2.訪問數組中全部元數  等同於 echo ${array1[*]}
[root@gjy ~]# echo ${tt_array2[@]}
bash shell tom jack alice
#3.訪問數組中全部元數的索引
[root@gjy ~]# echo ${!tt_array2[@]}
index4 index1 index2 index3

3. 數組遍歷與循環

方式一:經過數組元數的個數進行遍歷(不推薦) 。

方式二:經過數組元數的索引進行遍歷(推薦)

注意: 將統計的對象做爲數組的索引,僅針對關聯數據。

01.普通數組賦值與遍歷示例

[root@gjy ~]# 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@gjy ~]# 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@gjy ~]# declare -A array_passwd
[root@gjy ~]# array_passwd=([/bin/bash]=1 [/sbin/nologin]=1)
[root@gjy ~]# let array_passwd[/bin/bash]++
[root@gjy ~]# let array_passwd[/sbin/nologin]++
[root@gjy ~]# echo ${!array_passwd[@]}
/sbin/nologin /bin/bash
[root@gjy ~]# echo ${array_passwd[@]}
2 2

03. 統計Nginx日誌IP訪問次數

[root@gjy ~]# cat array_nginx_count.sh
#!/usr/bin/bash
# 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. 統計tcp的狀態信息

[root@gjy ~]# 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
相關文章
相關標籤/搜索