一、函數
1.1 函數的定義
函數是腳本的別名
作用:函數可以避免代碼重復,可讀性強,可以簡化腳本。
格式:函數名(){腳本}
1.2? 如何使用函數
1.定義
2.調用
函數一定要先定義再使用
例子:
錯誤示例
正確示例?
1.3 函數文件
專門存放函數的文件
要使用的時候
. 或者絕對路徑的文件名 放在腳本的最前面?
?1.4?函數變量的作用范圍
用法:加local 關鍵字(加locao只會在函數內部生效,不影響外界環境)
?1.5?函數的返回值
return表示退出函數并返回一個退出值,腳本中可以用$?變量表示該值
使用原則:
-
函數一結束就去返回值,應為$?變量只返回執行的最后一條命令的退出返回碼
-
退出碼必須是0-255,超出的值將為除以256取余
?
例子
?
?1.6?函數的傳遞參數
1.7 函數的遞歸
實際應用就是階乘
實驗:
#!/bin/bash
fact () {
if [ $1 -eq 1 ]
then
echo 1
else
echo $[ $1 * `fact $[$1-1]` ] //如果輸入的數不是1那么就用這個數乘以他本身減去一,如此循環,直到1
fi}
fact $1
?二、數組
2.1 數組的類別
數組分為普通數組和關聯數組
普通數組:下標是數字關聯數組:下標是與含義的字符串
declare -a 數組名
#普通數組可以不事先聲明,直接使用
declare -A 數組名?
#關聯數組必須先聲明,再使用
2.2 聲明數組
1.數組名=(數組值,中間用空格隔開)
2.數組名[下表1]=數值1
例子:
普通數組
關聯數組
?2.3 刪除數組
普通數組
關聯數組
?2.4 數組切片
格式
${數組名[@]:跳過個數:要取個數}
?2.5 進階:冒泡排序
提出問題:假如我有一個隨機數的數組我想讓他從小到大排列,該怎么做
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
done
echo "原始數組為: ${a[*]}"
#隨機生成一個數組
l=${#a[*]}
#定義l的長度為數組a 10
for ((i=1;i<$l;i++))
#比較的輪數
dofor ((j=0;j<$l-$i;j++))
#兩個相鄰的數需要比較的輪數dofirst=${a[$j]}
#數組的第一個數k=$[$j+1]
#計算下一個數的角標second=${a[$k]}
#數組的第二個數if [ $first -gt $second ]thentemp=$firsta[$j]=$seconda[$k]=$tempfidone
done
echo "排序后的數組為: ${a[@]}"
總結:
1. 注意在函數內傳遞參數與通過位置變量在函數外傳遞參數的區別(函數傳遞由腳本變量的位置決定)。
2. 注意函數中局部變量和全局變量的區別。
3.在接收位置變量的值時,建議給出一個新定義的變量,以增加代碼的可讀性。
4.對遞歸函數的理解是對函數的深入運用和挖掘,尤其是遞歸方面的運用。
5.注意需要保持函數的腳本形式也可以在文件中構建函數庫,另外調用文件的第一條語句要調用源代碼或". "。
6. 如何構建數組(我們可以將其視為包含多個獨立元素的變量集合)。
?