標籤:shell 函數
函數:function
過程式編程:代碼重用
模組化編程
結構化編程
把一段獨立功能的代碼當作一個整體,並為之一個名字;命名的程式碼片段,此即為函數;
注意:定義函數的程式碼片段不會自動執行,在調用時執行;所謂調用函數,在代碼中給定函數名即可;
函數名出現的任何位置,在代碼執行時,都會被自動替換為函數代碼;
文法一:
function f_name {
...函數體...
}
文法二:
f_name() {
...函數體...
}
函數的生命週期:每次被調用時建立,返回時終止;
其狀態返回結果為函數體中啟動並執行最後一條命令的狀態結果;
自訂狀態傳回值,需要使用:return
return [0-255]
0: 成功
-255: 失敗
樣本:給定一個使用者名稱,取得使用者的id號和預設shell;
#!/bin/bash#userinfo() { if id "$username" &> /dev/null; then grep "^$username\>" /etc/passwd | cut -d: -f3,7 else echo "No such user." fi}username=$1userinfousername=$2userinfo
樣本2:服務指令碼架構
#!/bin/bash## chkconfig: - 50 50# description: test service script#prog=$(basename $0)lockfile=/var/lock/subsys/$progstart() { if [ -f $lockfile ]; then echo "$prog is running yet." else touch $lockfile [ $? -eq 0 ] && echo "start $prog finshed." fi}stop() { if [ -f $lockfile ]; then rm -f $lockfile [ $? -eq 0 ] && echo "stop $prog finished." else echo "$prog is not running." fi}status() { if [ -f $lockfile ]; then echo "$prog is running" else echo "$prog is stopped." fi}usage() { echo "Usage: $prog {start|stop|restart|status}"}case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;;esac
函數傳回值:
函數的執行結果傳回值:
(1) 使用echo或printf命令進行輸出;
(2) 函數體中調用的命令的執行結果;
函數的退出狀態代碼:
(1) 預設取決於函數體中執行的最後一條命令的退出狀態代碼;
(2) 自訂:return
函數可以接受參數:
傳遞參數給函數:
在函數體中當中,可以使用$1,$2, ...引用傳遞給函數的參數;還可以函數中使用$*或[email protected]引用所有參數,$#引用傳遞的參數的個數;
在調用函數時,在函數名後面以空白符分隔給定參數列表即可,例如,testfunc arg1 arg2 arg3 ...
樣本:添加10個使用者,
添加使用者的功能使用函數實現,使用者名稱做為參數傳遞給函數;
#!/bin/bash## 5: user existsaddusers() { if id $1 &> /dev/null; then return 5 else useradd $1 retval=$? return $retval fi}for i in {1..10}; do addusers ${1}${i} retval=$? if [ $retval -eq 0 ]; then echo "Add user ${1}${i} finished." elif [ $retval -eq 5 ]; then echo "user ${1}${i} exists." else echo "Unkown Error." fidone
變數範圍:
局部變數:範圍是函數的生命週期;在函數結束時被自動銷毀;
定義局部變數的方法:local VARIABLE=VALUE
本地變數:範圍是運行指令碼的shell進程的生命週期;因此,其作用範圍為當前shell指令碼程式檔案;
樣本程式:
#!/bin/bash#name=tomsetname() { local name=jerry echo "Function: $name"}setnameecho "Shell: $name"
函數遞迴:
函數直接或間接調用自身;
案例:實現如下功能
10!=10*9!=10*9*8!=10*9*8*7!=...
n
n*(n-1)!=n*(n-1)*(n-2)!=
#!/bin/bash#fact() { if [ $1 -eq 0 -o $1 -eq 1 ]; then echo 1 else echo $[$1*$(fact $[$1-1])] fi}fact $1
實現如下數列:
1,1,2,3,5,8,13,21,...
#!/bin/bash#fab() {if [ $1 -eq 1 ]; then echo -n "1 " elif [ $1 -eq 2 ]; then echo -n "1 " else echo -n "$[$(fab $[$1-1])+$(fab $[$1-2])] "fi}for i in $(seq 1 $1); do fab $idoneecho
本文出自 “汪立明” 部落格,請務必保留此出處http://afterdawn.blog.51cto.com/7503144/1916045
shell指令碼編程之函數