Shell陣列基本概述
阿新 • • 發佈:2022-12-12
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