shell - 函數和數組

函數

# 函數定義的方式
函數名(){   # 注意這裏有空格
        commands
}
function 函數名{
    commands
}

# 使用$1, $2, $3方式傳參
func(){ echo "hello $1"}    # 調用 func lily
func2(){ echo "hello $*"}   # 傳多個參數 func2 lili clerk mephy

# 注意函數傳參和腳本傳參不同
num=$1   # 就須要外部傳參

# 函數的返回值
return 只能返回 1-255的整數
echo 返回字符串
return 1  # $? 結果爲1

數組

數組能夠存多個值,根據下標輸出值
tt=(aa bb cc dd )
echo ${tt}  # 輸出第一個
echo ${tt[@]}  ${tt[*]}  # 都是輸出所有
echo ${!tt[*]}  # 輸出下標
# 普通數組 VS 關聯數組
普通數組 tt=(linux windows   shell) # 下標只能是整數
關聯數組 info=([name]=clerk [age]=18 [gender]=female )
取值: info[name]
# 定義關聯數組
declare -A info
info=([name]=clerk [age]=18 [gender]=female )
# 取值
echo ${info[age]}
echo ${info[@]}
echo ${!info[@]}   # 取索引
# 取消關聯數組
unset info
#################### 普通數組操做 ##############################
# 變量賦值-- 方式一
array[0]=linux
array[1]=python
# 變量賦值 -- 方式二
array2=(aa bb cc)
array(1 3 44 "linux shell" [20]=docker)  # 索引20對應的值爲docker
# 賦值 -- 方式三
array4=(`cat /etc/passwd`)  # 一行行的賦值
# 取出值
declare -a|grep array
echo ${array[1]}
echo ${array[@]}  # 取全部
echo ${! array[@]}  # 取索引
echo ${#array[@]}  # 統計數組元素個數
    
############################ 關聯數組操做 ###########################
1. 聲明關聯數組 
declare -A info
2. 賦值
info[name]=clerk  # 單個賦值
info=([age]=18 [gender]=female)  
3. 取值
echo ${info[name]}   
echo ${info[@]}   # 取全部
echo ${!info[@]}  #取索引
echo ${#info[@]}  # 看個數   
4. 查看
declare -A|grep info

數組的遍歷與循環

# 經過數組的索引進行遍歷
#!/usr/bin/bash
# 批量對數組進行賦值
i=0
while read line
do
    hosts[i++]=$line
done</etc/hosts
# 取出數組中的每個元素和其索引
for i in ${!hosts[@]}
do 
    echo "索引和值分別爲: $i , ${hosts[i]}"
done

使用關聯數組統計文件中的男女性別

#!/usr/bin/bash
# 注意要先聲明
declare -A info_sex
# 遍歷文件
while read line
do
    sex=$(echo $line|awk '{print $2}')
    let info_sex[$sex]++    # 每循環一次就加一
done<gender.txt
# 遍歷數組,取出全部
for i in ${!info_sex[@]}
do 
    echo $i , ${info_sex[$i]}
done
'''
將性別做爲key, 出現的次數爲value
let info_sex[$sex]++
'''

使用數組統計 /etc/passwd的shell 的數量

#!/usr/bin/bash
declare -A array_pass
while read line
do
    type=$(echo $line|awk -F ":" '{print $NF}')
    let array_pass[$type]++
done</etc/passwd

for i in ${!array_pass[@]}
do
    echo $i,  ${array_pass[$i]}

done

統計Nginx 日誌IP訪問次數

#!/usr/bin/bash
declare -A nginx_ip
while read line
do
        type=$(echo $line|awk '{print $1}')
        let nginx_ip[$type]++

done<log.log

for j in ${!nginx_ip[@]}
do
        echo $j  , ${nginx_ip[$i]}

done
#!/usr/bin/bash

declare -A tcp_status
ss_types=$(ss -an|awk '{print $2}')
for i in $ss_types
do
    let tcp_status[$i]++
done
for j in ${!tcp_status[@]}
do
    echo $j, $tcp_status[$j]
done
相關文章
相關標籤/搜索