function 函數(shù)名() { #<==作者推薦的書寫函數(shù)的方法(帶括號(hào))
? ? 指令集...
? ? return n
}
簡(jiǎn)化寫法1:
function 函數(shù)名 {
? #<==不推薦讀者使用此方法(無括號(hào),函數(shù)名和左大括號(hào)之間要有空格。)
? ? 指令集...
? ? return n
}
在Shell函數(shù)的語(yǔ)法中,當(dāng)有function時(shí),函數(shù)名后面的小括號(hào)“()”部分可以省略不寫。
簡(jiǎn)化寫法2:
函數(shù)名() {? #<==不用function的方法
? ? 指令集...
? ? return n
}
在Shell函數(shù)的語(yǔ)法中,function表示聲明一個(gè)函數(shù),這部分可以省略不寫。
oldboy(){
? ? echo "I am oldboy."
? ? echo "I am oldgirl."
}
for n in {1..5}
do
? oldboy
done
[root@web01 /etc/init.d]# cat rsyncd
#!/bin/bash
# chkconfig: 2345 21 81
# description: startup rsync scripts
if [ "$1" = "start"? ]
then
? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? then
? ? ? :
? else
? ? ? rsync --daemon
? fi
elif [ "$1" = "stop"? ]
then
? ? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? ? then
? ? ? ? kill `cat /var/run/rsyncd.pid`
? ? else
? ? ? ? echo "Failed to stop rsync Unit rsync not loaded."
? ? ? ? exit 1
? ? fi
elif [ "$1" = "restart"? ]
then
? ? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? ? then
? ? ? ? kill `cat /var/run/rsyncd.pid`
? ? fi
? sleep 2
? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? then
? ? ? :
? else
? ? ? rsync --daemon
? fi
else
? ? echo "Usage;$0 {start|stop|restart}"
fi
[root@web01 /etc/init.d]# cat rsyncd1
#!/bin/bash
# chkconfig: 2345 21 81
# description: startup rsync scripts
start(){
if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? then
? ? ? :
? else
? ? ? rsync --daemon
fi
}
stop(){
? ? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? ? then
? ? ? ? kill `cat /var/run/rsyncd.pid`
? ? else
? ? ? ? echo "Failed to stop rsync Unit rsync not loaded."
? ? ? ? exit 1
? ? fi
}
if [ "$1" = "start" ]
then
? start
elif [ "$1" = "stop" ]
then
? stop
elif [ "$1" = "restart" ]
then
? $0 stop
? sleep 2
? $0 start
else
? ? echo "Usage;$0 {start|stop|restart}"
fi
[root@web01 /etc/init.d]# cat rsyncd2
#!/bin/bash
# chkconfig: 2345 21 81
# description: startup rsync scripts
start(){
if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? then
? ? ? :
? else
? ? ? rsync --daemon
fi
}
stop(){
? ? if [ -f /var/run/rsyncd.pid -a -s /var/run/rsyncd.pid ]
? ? then
? ? ? ? kill `cat /var/run/rsyncd.pid`
? ? else
? ? ? ? echo "Failed to stop rsync Unit rsync not loaded."
? ? ? ? exit 1
? ? fi
}
main(){
if [ "$1" = "start" ]
then
? start
elif [ "$1" = "stop" ]
then
? stop
elif [ "$1" = "restart" ]
then
? $0 stop
? sleep 2
? $0 start
else
? ? echo "Usage;$0 {start|stop|restart}"
fi
}
main $*
函數(shù)的參數(shù):? 腳本的參數(shù):
函數(shù)后接的參數(shù)說明:
? Shell的位置參數(shù)($1、$2…、$#、$*、$?以及$@)都可以作為函數(shù)的參數(shù)使用。
? 此時(shí)父腳本的參數(shù)臨時(shí)地被函數(shù)參數(shù)所掩蓋或隱藏。
? $0比較特殊,它仍然是父腳本的名稱。
? 當(dāng)函數(shù)執(zhí)行完成時(shí),原來的命令行腳本的參數(shù)即恢復(fù)。
? 函數(shù)的參數(shù)變量是在函數(shù)體里面定義的。
[root@web01 /server/scripts]# cat func3.sh
oldboy(){
? ? echo "I am $1"
}
oldboy xiangbo
[root@web01 /server/scripts]# cat func4.sh
oldboy(){
? ? echo "I am $1."
}
oldboy $1
練習(xí)1:檢測(cè)網(wǎng)站URL是否異常(可以用本地URL或者www.baidu.com)
練習(xí)2:用函數(shù)實(shí)現(xiàn)上述功能。
練習(xí)3:將函數(shù)的傳參轉(zhuǎn)成腳本文件命令行傳參,對(duì)命令行接任意指定URL判斷是否異常。
[root@web01 /server/scripts]# cat check_url1.sh
#!/bin/sh
wget -q 127.0.0.1 &>/dev/null
retval=$?
if [ $retval -eq 0 ]
then
? echo "url is ok."
else
? echo "url is no."
fi
改成傳參:
[root@web01 /server/scripts]# cat check_url2.sh
#!/bin/sh
wget -q $1 &>/dev/null
retval=$?
if [ $retval -eq 0 ]
then
? echo "url is ok."
else
? echo "url is no."
fi
專業(yè)寫法:
[root@web01 /server/scripts]# cat check_url3.sh
#!/bin/sh
check_url(){
wget -q $1 &>/dev/null
retval=$?
if [ $retval -eq 0 ]
then
? echo "url is ok."
else
? echo "url is no."
fi
}
main(){
? ? check_url $1
}
main $*
[root@web01 /server/scripts]# sh check_url3.sh 127.0.0.1
url is ok.
[root@web01 /server/scripts]# cat check_url3.sh
#!/bin/sh
usage(){
? ? if [[ ! $1 =~ http://www.*com ]]
? ? then
? ? ? ? echo "Usage:$0 http://www.xx.com"
? ? ? ? exit 1
? ? fi
}
check_url(){
wget -q $1 &>/dev/null
retval=$?
if [ $retval -eq 0 ]
then
? echo "url is ok."
else
? echo "url is no."
fi
}
main(){
? ? usage $1
? ? check_url $1
}
main $*
[root@web01 /server/scripts]# cat check_url4.sh
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
usage(){
? ? if [[ ! $1 =~ http://www.*com ]]
? ? then
? ? ? ? echo "Usage:$0 http://www.xx.com"
? ? ? ? exit 1
? ? fi
}
check_url(){
wget -q $1 &>/dev/null
retval=$?
if [ $retval -eq 0 ]
then
? action? "url is ok." /bin/true
else
? action "url is no." /bin/false
fi
}
main(){
? ? usage $1
? ? check_url $1
}
main $*
[root@web01 /server/scripts]# sh check_url4.sh http://www.baidu.com
url is ok.? ?