1. Shell函數的好處
1. 簡化程序代碼,實現代碼重用
- 實現一次定義多次調用。如:is_root_user()函數可 以由不同的shell腳本重複使用。
2. 實現結構化編程
- 使腳本內容更加簡潔,增強程序的易讀性
3. 提高執行效率
- 將常用的功能定義爲多個函數並將其保存在一個文件中,類似其他語言的“模塊”文件
- 在
~/bashrc
裏或命令行上使用source
命令調用這個文件 - 此文件中定義的多個函數一次性地調入內存,從而加快運行速度
2. 函數的定義和調用
1. 函數定義
function 函數名 { commands }
函數名 () { commands }
2. 函數調用
只需輸入函數名即可調用函數,函數必須在調用之前定義
函數名
函數名 參數1 參數2 …
3. 函數的存儲和顯示
1. 函數的存儲
-
函數和調用它的主程序保存在同一個文件中
函數的定義必須出現在調用之前
-
函數和調用它的主程序保存在不同的文件中
保存函數的文件必須先使用
source
命令執行,之後才 能調用其中的函數
2. 函數的顯示
-
顯示當前Shell可見的所有函數名
$ declare -F
-
顯示當前Shell可見的所有(指定)的函數定義
$ declare -f $ declare -f <functionName>
4. 函數的調用舉例
- 函數和調用它的主程序保存在同一個文件中
#!/bin/bash
## filename: function-1.sh
### User define Function (UDF) ###
sql_bak () { echo "Running mysqldump tool..."; }
sync_bak () { echo "Running rsync tool..."; }
git_bak () { echo "Running gistore tool..."; }
tar_bak () { echo "Running tar tool..."; }
### Main script starts here ###
PS3="Please choose a backup tools : "
select s in mysqldump rsync gistore tar quit ; do
case $REPLY in
1) sql_bak ;;
2) sync_bak ;;
3) git_bak ;;
4) tar_bak ;;
5) exit ;;
esac
done
- 函數和調用它的主程序保存在不同的文件
#!/bin/bash
## filename: function-2.sh
### User define Function (UDF) ###
sql_bak () { echo "Running mysqldump tool..."; }
sync_bak () { echo "Running rsync tool..."; }
git_bak () { echo "Running gistore tool..."; }
tar_bak () { echo "Running tar tool..."; }
#!/bin/bash
source /root/bin/function-2.sh
### Main script starts here ###
PS3="Please choose a backup tools : "
select s in mysqldump rsync gistore tar quit ; do
case $REPLY in
1|[mM]ysqldump) sql_bak ;;
2|[rR]sync) sync_bak ;;
3|[gG]istore) git_bak ;;
4|[tT]ar) tar_bak ;;
5) exit ;;
esac
done
5. 參數與變量
1. 參數
- 調用函數時,使用位置參數的形式爲函數傳遞參數
- 函數內的$1-${n}、$*和$@表示接收到的參數
- $1-${n}表示第n個參數
- $*表示將所有位置參量看成一個字符串
- $@表示將每個位置參量看成單獨的字符串(以空格間隔)
- 函數調用結束後位置參數$1-${n}、 $* 和 $@ 將被重置爲調用函數之前的值
- 在主程序和函數中,$0始終代表腳本名
2. 變量
-
函數內使用 local 聲明的變量是局部變量
局部變量的作用域是當前函數以及其調用的所有函數
-
函數內未使用 local 聲明的變量是全局變量
主程序和函數中的同名變量是一個變量(地址一致)
6. 函數的結束和返回值
-
當函數的最後一條命令執行結束,函數結束
- 函數的返回值就是最後一條命令的退出碼
- 其返回值被保存在系統變量
$?
中
-
可以使用return 或exit顯示地結束函數
return [N]
return
將結束函數的執行- 可以使用N指定返回值
exit [N]
exit
將中斷當前函數和當前Shell的執行- 可以使用N指定返回值
return只能返回整數值,可以使用標準輸出實現函數的返回值
-
標準輸出實現函數的返回值
- 通用的方法,既能返回整數又能返回字符串
- 函數結束前使用
echo
命令將結果顯示到標準輸出 - 調用函數時使用如下的格式將函數的輸出結果存到變量
RES
中,之後便可使用變量$RES
的值
7. 標準輸出實現函數的返回值舉例
#!/bin/bash
# User define Function (UDF)
to_upper () {
local str="$@"
local output
output=$(tr '[a-z]' '[A-Z]'<<<"${str}")
echo $output
}
### Main script starts here ###
to_upper "This Is a TEST"
res=$(to_upper "$@")
echo "$res"
res=$(to_upper "$1")
[[ $res == "YES" ]] && echo "Continue..." || echo "Stop"