1. 程式人生 > >shell函數基礎

shell函數基礎

shell 功能 com 判斷 恢復 分享 系統命令 離開 當前

有關函數的重要說明:

執行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函數基礎