shell学习之二十--函数及函数的作用

一、定义
函数和别名差不多,具有和别名相同的功能。
简单的说函数的作用就是把程序里多次调用相同的代码部门定义成一份,然后起个名字,
所有的调用都只用这个名字就可以了。修改代码时,只需要改变函数体内的代码即可。
优势:
1、把相同的程序段定义成函数,可以减少程序代码量。
2、增加程序的可读、易读性。
3、实现程序的功能模块化。

二、shell函数的语法
语法格式
函数名(){
  指令。。。
  return n
}
规范写法
function 函数名(){
  指令。。。
  return n
}

三、函数的执行
调用函数
1、直接执行函数名即可。
函数名
注意:
a、执行函数时,不要带小括号了。
b、函数定义及函数体必须在要执行的函数名前面定义。shell的执行从上倒下按行执行的。
2、带参数的函数执行方法
函数名 参数1 参数2
【函数带参数的说明】
a、在函数体中位置参数($1、$2、$3、$4、$5、$#、$*、$?、$@)都可以是函数的参数。
b、父脚本的参数则临时地被函数参数所掩盖或隐藏。
c、$0比较特殊,他任然是父脚本的名称。
d、当函数完成时,原来的命令行参数会恢复。
e、在shell函数里面,return命令的功能与工作方式与exit相同,用于跳出函数。
f、在shell函数里使用exit会终止整个脚本。
g、return语句返回一个退出值给调用的程序。

函数实例
3、调用自己写的函数
[root@node01 day8]# vi fun01.sh 
#!/bin/sh
wolf01() {
   echo "I am wolf"
}
wolf01
[root@node01 day8]# vi fun01.sh 
#!/bin/sh
wolf01() {
   echo "I am wolf"
}
echo "`wolf01`"  打印函数
[root@node01 day8]# sh fun01.sh 
I am wolf               

[root@node01 day8]# vi exec01.sh 
#!/bin/sh
[ -f fun02.sh ] && . /data/day8/fun02.sh||exit 1  如果fun02.sh不存在,则不执行
wolf01
[root@node01 day8]# sh exec01.sh 
I am wolf

4、调用系统的函数
之前学习过/etc/init.d/functions   
vi /etc/init.d/functions 
#by wolf
wolf(){
echo "this is wolf,you are $1."
}
调用系统函数
[root@node01 day8]# vi exec01.sh 
#!/bin/sh
#[ -f fun02.sh ] && . /data/day8/fun02.sh||exit 1
. /etc/init.d/functions
wolf
[root@node01 day8]# sh exec01.sh 
this is wolf,you are .

5、函数的传参
[root@node01 day8]# tail -4 /etc/init.d/functions 
#by wolf
wolf(){
echo "this is wolf,you are $1."   传参
}
[root@node01 day8]# vi exec01.sh 
#!/bin/sh
#[ -f fun02.sh ] && . /data/day8/fun02.sh||exit 1
. /etc/init.d/functions
wolf good                         good是传入的参数
[root@node01 day8]# sh exec01.sh                  
this is wolf,you are good
把上面的修改为脚本传参
[root@node01 day8]# vi exec01.sh 
#!/bin/sh
#[ -f fun02.sh ] && . /data/day8/fun02.sh||exit 1
. /etc/init.d/functions
wolf $1                        脚本传参
[root@node01 day8]# sh exec01.sh cc
this is wolf,you are cc.

脚本传参的过程  cc---exec01.sh的$1---/etc/init.d/functions的$1---最后打印

6、综合列子:使用行数及函数传参,脚本传参实现,对任意指定的URL判断是否异常
使用curl返回200判断
[root@node01 day8]# vi check_web_by_fun.sh
#!/bin/sh
function Check_Url(){ 
   curl -I -s $1|head -1 && return 0||return 1
}
Check_Url $1
[root@node01 day8]# sh check_web_by_fun.sh baidu.com
HTTP/1.1 200 OK

使用curl返回200判断
[root@node01 day8vi check_web_by_fun01.sh com         
#!/bin/sh
function Check_Url(){
    curl -I -s -w "%{http_code}" $1 -o /dev/null           
}
Check_Url $1

使用wget返回0判断
[root@node01 day8]# vi check_web_by_fun02.sh              
#!/bin/sh
function Check_Url(){
wget --spider --timeout=100 --tries=2 $1 &>/dev/null
if [ $? -ne 0 ]
   then
     echo "web is error"
else
   echo "web is ok" 
fi
}
Check_Url $1
[root@node01 day8]# sh check_web_by_fun02.sh www.baidu.com
web is ok

你可能感兴趣的:(shell)