shell 函数

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编程实战》

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值