函數
# 函數定義的方式
函數名(){ # 注意這裏有空格
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