一.函數
1、函數的作用
定義較為復雜的但是需要重復使用的內容,以便再次使用,可以直接調用,節約時間,提高效率。
語句塊定義成函數約等于別名,定義函數,再引用函數。
封裝的可重復利用的具有特定功能的代碼。
2、函數使用步驟
①首先是定義函數
②其次是調用函數(注意:若定義完成不調用則函數無效)
③查看系統限制所有函數:declare -F
④查看函數定義詳細內容:declare -f ?函數名
⑤刪除函數:unset ?函數名
3、定義函數基本格式
1.function 函數名 () {函數內容}2.function 函數名 {函數內容}3.函數名 () {函數內容}
4.函數變量
作用范圍
- 函數在Shell腳本中僅在當前Shell環境中有效
- Shell腳本中變量默認全局有效
- 將變最限定在函數內部使用local命令
示例腳本1:Shell腳本中變量默認全局有效
#!/bin/bashfun(){i=10
}i=20
fun
echo $i
示例腳本2:將變量限定在函數內部使用local命令
5.函數的調用方法
示例腳本1:查看當前操作系統
#定義函數
#!/bin/bashos (){
if grep -i -q "CentOS Linux 7 " /etc/os-release
then echo "此操作系統是centos 7"elif grep -i -q "CentOS Linux 6 " /etc/os-release
then echo "此操作系統是centos 6"elif grep -i -q "CentOS Linux 8 " /etc/os-release
then echo "此操作系統是centos 8"
fi
}#調用函數
os
示例腳本2:?函數備份yum線上源,創建yum本地源和清理緩存安裝httpd
#!/bin/bash
backups(){
cd /etc/yum.repos.d
mkdir repo.bak
mv *.repo repo.bak
mount /dev/sr0 /mnt >/dev/null
}configuration(){
echo -e '[local]\nname=local\nbaseurl=file:///mnt\nenable=1\ngpgcheck=0' >/etc/yum.repos.d/local.repo
}clean(){
yum clean all
yum makecache
yum install -y httpd > /dev/null
}backups
configuration
clean
6.函數的返回值
return表示退出函數并返回一個退出值,腳本中可以用$?變量顯示該值
使用原則:
函數一結束就取返回值,因為$?變量只返回執行的最后一條命令的退出狀態碼
退出狀態碼必須是0~255,超出范圍將除以256取余
如何解決大于255:
7.函數傳參
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數…即使用位置參數來實現參數傳遞。
示例腳本:
#!/bin/bash
sum () {
echo "第一個位置參數:" $1
echo "第二個位置參數:" $2
let n=$1+$2
echo $n
}
sum $2 $1#!/bin/bash
sum () {
echo "第一個位置參數:" $1
echo "第二個位置參數:" $2
let n=$1+$2
echo $n
}
sum $1 $2
8.函數的遞歸?
函數調用自己本身的函數
示例腳本1:階乘
二.數組
1.數組定義
與大部分編程語言類似,數組元素的下標由 0 開始
Shell 數組用括號來表示,元素用"空格"符號分割開
在shell語句中,使用、遍歷數組的時候,數組格式要寫成 ${arr[@]} 或 ${arr[*]}
2.數組分類
①關聯數組:必須聲明才可以使用,命令:delare? -A? ?數組名??
②普通數組:利用數字下標節約變量,可以不聲明也可以聲明,命令:delare -a? 數組名
delare? -a命令也可查看有哪些普通數組
3.數組的語法格式
格式一:
數組名=(value1 value2 ... valuen)
arr_number=(1 2 3 4 5 6 7 8 9)格式二:
數組名=([0]=value0 [1]=value0 [2]=value0 ...)
arr_number=([0]=1 [1]=2 [2]=3 [3]=4)格式三:
列表名:“value1 value2 valueN ..."
數組名=($列表名)
list_number="1 2 3 4 5 6"
arr_number=($list_number)格式四:
數組名[0]="value"
數組名[1]="value"
數組名[2]="value"
arr_number[0]=1
arr_number[1]=2
arr_number[2]=3
4.數組的數據類型
- 數值類型
- 字符類型
- 使用 “ ”(雙引號) 或者 ‘ ’ (單引號)定義
#數組可以是數值型
a=(1 2 3 4 5);echo ${a[@]}
1 2 3 4 5#數組可以是混合型
a=(a 1 2 apple);echo ${a[@]}
a 1 2 apple
5.?獲取數組的長度
echo ${#數組名[*]}
echo ${#數組名[@]}
6.獲取數組下標對應的值
數組名=(元素0 元素1 元素2 ……) 定義數組
echo ${數組名[索引值]} 輸出數組索引值對應的元素,索引值為從0開始
7.數組的常用操作
7.1??數組的遍歷
#!/bin/bash
a=(1 2 3 4 5 6)
for i in ${a[@]}
doecho $i
done
7.2??數組切片
a=(0 1 2 3 4 5 6 7 8)
echo "輸出整個數組: " ${a[@]}
echo "取出數組1到3: " ${a[@]:1:3}
echo "取出數組5到后面所有的元素: " ${a[@]:5:5}
7.3 數組替換
#臨時替換
echo ${a[@]/原替換位置/替換內容} #重新賦值,可以永久修改
a=(${a[@]/原替換位置/替換內容})
7.4??數組刪除和指定下標的值刪除
#刪除整個數組
unset 數組名#刪除指定下標的值
unset 數組名[數組下標]
7.5 數組追加元素
?方法一:直接使用下標進行元素的追加
數組名[下標]=變量
方法二:?將數組的長度作為下標進行追加元素
數組名[${數組名[@]}]=變量名
方法三:?使用+=進行追加
數組名+=(變量1 變量2 ...)
7.6?declare -a:?查看所有數組
三.冒泡排序
#!/bin/bash
#排序之前的數組順序
a=(10 40 33 30 77 66 44 )
#確定循環比較的次數
for ((j=1;j<${#a[@]};j++))
do
#對比獲取每次的最大元素的索引位置
for ((i=0;i<${#a[@]}-j;i++))
do
#如果對比出最大元素,就把該元素賦值給后面的變量tmp
if [ ${a[$i]} -gt ${a[$i+1]} ]
then
#定義一個變量tmp,將每次比較的最大數值放進tmp,實現變量對換
tmp=${a[$i+1]}
a[$i+1]=${a[$i]}
a[$i]=$tmp
fi
done
done
echo ${a[*]}
補充
全部調用:echo? ${a[@]}
? ? ? ? ? ? ? ? ? echo? ${a[*]}
echo? ${#a[@]}:顯示數組的值的個數
echo? ${!a[@]}:顯示所有下標