shell函数语法
语法:
#其标准写法为:
function 函数名() { #<==推荐的书写函数的方法(带括号)
指令……
return n
}
#简化写法1:
function 函数名{ #<==不推荐使用此方法(无括号)
指令……
return n
}
#简化写法2:
函数名() { #<==不用function的方法
指令……
return n
}
示例 vim fun.sh
#! /bin/bash
function say ( ) { echo 'say hello'; }
say
美观写法
#! /bin/bash
function say()
{
echo 'say hello'
}
say
- 方法名后面可以有多个空格
- 括号内可以有多个空格
- 括号可以不要,但是为了美观,建议加上括号
- 如果方法体写成一行,需要在语句后面加分号“;”
shell函数的执行
执行不带参数的函数,直接输入函数名即可
函数名
- 执行不带参数的函数时,直接输入函数名即可(注意不带小括号)
- 函数的定义必须在要执行的程序前面定义或加载
- Shell执行系统中各种程序的执行顺序为:系统别名→函数→系统命令→可执行文件
- 函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量及特殊位置参数。
- 在Shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件。
- return语句会返回一个退出值(即返回值)给调用函数的当前程序,而exit会返回一个退出值(即返回值)给执行程序的当前Shell。
- 如果将函数存放在独立的文件中,被脚本加载使用时,需要使用source或“.”来加载。
- 在函数内一般使用local定义局部变量,这些变量离开函数后就会消失。
带参数的函数执行方法,格式如下:
函数名 参数1 参数2
- shell的位置参数($1、$2…、$#、$*、$?及$@)都可以作为函数的参数来使用。
- 此时父脚本的参数临时第被函数参数所掩盖或隐藏。
- $0比较特殊,它仍然是父脚本的名称。
- 当函数执行完成时,原来的命令行脚本的参数即可恢复。
- 函数的参数变量是在函数体里面定义的
利用shell开发检测url脚本:
实现脚本传参,检查Web URL是否正常。
#! /bin/sh
#判断传参个数是否为1个。
if [ $# -ne 1 ];then
echo $"usage:$0 url"
exit 1
fi
wget --spider -q -o /dev/null --tries=1 -T 5 $1
#<==--spider 当使用此选项调用时,Wget将表现为Web蜘蛛,这意味着它不会下载页面,只需检查它们是否存在。
#<==-q 关掉Wget的输出。
#<==--tries 重试次数。无限重试指定0。默认情况是重试20次,但“拒绝连接”或“未找到”(404)等致命错误除外。
#<==-T指定超时时间,这里的$1为脚本的参数。
if [ $? -eq 0 ];then
echo "$1 is yes."
else
echo "$1 is no."
fi
将上述检测的功能写成函数,并将函数传参转换成脚本命令行传参,判断任意指定的URL是否存在异常。
#! /bin/sh
function usage(){ #<==帮助函数。
echo $"usage:$0 url"
exit 1
}
function check_url(){ #<==检测URL函数。
wget --spider -q -o /dev/null --tries=1 -T 5 $1
#<==--spider 当使用此选项调用时,Wget将表现为Web蜘蛛,这意味着它不会下载页面,只需检查它们是否存在。
#<==-q 关掉Wget的输出。
#<==--tries 重试次数。无限重试指定0。默认情况是重试20次,但“拒绝连接”或“未找到”(404)等致命错误除外。
#<==-T指定超时时间,这里的$1为脚本的参数。
if [ $? -eq 0 ];then
echo "$1 is yes."
else
echo "$1 is no."
fi
}
function main(){ #<==主函数。
if [ $# -ne 1 ] #<==如果传入的是多个参数,则打印帮助函数,提示用户。
then
usage
fi
check_url $1 #<==接收函数的传参,即把下文main结尾的$*传到这里。
}
main $* #<==这里的$*就是把命令行接收的所有参数作为函数参数传给函
运行脚本
[sy@sy-pc script]$ ./func.sh https://www.baidu.com
https://www.baidu.com is yes.
引入系统函数库
#! /bin/sh
. /etc/init.d/functions #<==引入系统函数库
function usage(){ #<==帮助函数。
echo $"usage:$0 url"
exit 1
}
function check_url(){ #<==检测URL函数。
wget --spider -q -o /dev/null --tries=1 -T 5 $1
#<==--spider 当使用此选项调用时,Wget将表现为Web蜘蛛,这意味着它不会下载页面,只需检查它们是否存在。
#<==-q 关掉Wget的输出。
#<==--tries 重试次数。无限重试指定0。默认情况是重试20次,但“拒绝连接”或“未找到”(404)等致命错误除外。
#<==-T指定超时时间,这里的$1为脚本的参数。
if [ $? -eq 0 ];then
action "$1 is yes." /bin/true #<==这里的action就是在脚本开头引入系统函数库后调用的。
else
action "$1 is no." /bin/false
fi
}
function main(){ #<==主函数。
if [ $# -ne 1 ] #<==如果传入的是多个参数,则打印帮助函数,提示用户。
then
usage
fi
check_url $1 #<==接收函数的传参,即把下文main结尾的$*传到这里。
}
main $* #<==这里的$*就是把命令行接收的所有参数作为函数参数传给函
运行结果
[sy@sy-pc script]$ ./8_6.sh https://www.dubai.com
https://www.dubai.com is yes. [ OK ]
[sy@sy-pc script]$ ./8_6.sh https://www.bbbbbbbb.com
https://www.bbbbbbbb.com is no. [FAILED]
参考:
[1]《跟老男孩学Linux变成:shell编程实战》