shell函數基礎
執行shell函數時,函數名前的function和函數名後面的小括號都不要;
函數的定義必須要在執行的程序前面定義或加載
shell執行系統中各種程序的執行順序為:系統別名-->函數-->系統命令-->可執行文件
函數執行時,會和調用它的腳本共用變量,也可以為函數設置局部變量及特殊位置參數
在shell函數裏面,return命令的功能與exit類似,return的作用是退出函數,而exit是退出腳本文件
return語句會返回一個退出值給調用函數的當前程序,而exit會返回一個退出值給執行程序的當前shell
如果將函數存放在獨立的文件中,被腳本加載使用時,需要使用source或者"."來加載
在函數內一般使用local定義局部變量,這些變量離開函數後就會消失
帶參數的函數執行方法:
函數名 參數1 參數2
函數後接參數的說明:
shell的位置參數($1,$2...$#,$?,$*,$@)都可以作為函數的參數來使用
此時父腳本的參數臨時地被函數參數所掩蓋或隱藏
$0比較特殊,它仍然是父腳本的名稱。
當函數執行完成時,原來的命令行腳本的參數即可恢復。
函數的參數變量是在函數體裏面定義的。
#!/bin/bash oldboy() { echo "I am oldboy" } function xpg { echo "I am xpg" } oldboy xpg ~
分離函數體和執行函數的腳本文件(更規範的方法)
首先建立函數庫腳本(默認不會執行函數)
使用cat命令追加多行文本,以將函數代碼追加到系統的函數文件中,即/etc/init.d/function。
[root@localhost ~]# cat >> /etc/init.d/functions <<-EOF oldboy() { echo "I am oldboy" } EOF ##這裏的EOF可以使用Tab健,而不頂格,但不能使用空格 ##不知道在這個文件裏面為什麽不能調用,所以使用test文件 寫出帶參數的shell函數 [root@localhost ~]# cat test old() { echo "I am oldgirl,you are $1" } [root@localhost ~]# cat 7.sh #!/bin/bash [ -f /root/test ] && source /root/test || echo 5 old xiaoting [root@localhost ~]# sh 7.sh I am oldgirl,you are xiaoting [root@localhost ~]# 範例8-4 將函數的參數轉換成腳本文件命令行傳參 [root@localhost ~]# cat test old() { echo "I am oldgirl,you are $1" } [root@localhost ~]# cat 7.sh #!/bin/bash [ -f /root/test ] && source /root/test || echo 5 old $1 [root@localhost ~]# sh 7.sh xiaoting I am oldgirl,you are xiaoting [root@localhost ~]#
8.5 利用shell函數開發企業級URL檢測腳本
範例8-5:腳本文件命令行傳參,判斷任意指定的URL是否存在異常。
#!/bin/bash if [ $# -ne 1 ]; then echo "plz usage:$0 URL" exit 3 fi wget -T 10 --tries=2 $1 >/dev/null tty=$? if [ $tty -eq 0 ]; then echo "$1 is yes" else echo "$1 is no" fi ~
將上述的檢測的功能寫成函數,並將函數傳參轉換成腳本命令行傳參,判斷任意指定的URL是否存在異常
自己寫的: #!/bin/bash aa() { if [ $# -ne 1 ]; then echo "plz usage:$0 URL" exit 3 fi } bb() { wget -T 10 --tries=2 $1 >/dev/null tty=$? if [ $tty -eq 0 ]; then echo "$1 is yes" else echo "$1 is no" fi } aa $* bb $* 官方的(更直接和權威): #!/bin/bash aa() { echo "plz usage:$0 URL" } bb() { wget -T 10 --tries=2 $1 >/dev/null tty=$? if [ $tty -eq 0 ]; then echo "$1 is yes" else echo "$1 is no" fi } main () { if [ $# -ne 1 ] then aa fi bb $1 } main $*
學習函數之後盡量將腳本功能模塊化,每個模塊實現一個功能,並且讓腳本可以通用。
範例8-6:將函數的傳參轉換成腳本文件命令行傳參,判斷任意指定的URL是否存在異常,並以更專業的輸出顯示;
#!/bin/bash . /etc/init.d/functions #引入系統函數庫 aa() { echo "plz usage:$0 URL" } bb() { wget -T 10 --tries=2 $1 -o /dev/null tty=$? if [ $tty -eq 0 ]; then action "$1 is yes" /bin/true #這裏的action就是在腳本開頭引入系統函數庫後調用的 else action "$1 is no" /bin/false fi } main () { if [ $# -ne 1 ] then aa fi bb $1 } main $* ~
shell函數基礎