bash shell基本语法之函数

803 阅读2分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

前言

本文对shell中函数的定义、使用、返回值等作一个示例说明.

函数

定义

bash shell函数的定义需要使用function来声明,格式如下:

function function_name

{

    ....相关代码/命令

}

上面的写法是在bash shell中,其它shell可能不支持,比如dash就不能识别function。

除了上面那种写法,还有另一种写法:

function_name()

{

    ...相关代码/命令

}

在函数名后面加一对英文括号()来声明(这个在bash和dash通用,其它的脚本没用过)。

function_name是函数名,必须是唯一的。函数需要先定义后使用。

使用

使用的时候,就像执行一个命令一样,调用函数名即可(不要像其它语言如c一样加括号)。示例如下:

#! /bin/bash

#定义函数hello
function hello
{
	echo "hello, world!"
}
#调用函数hello
hello

#定义函数hello2
hello2()
{
	echo "hello, world2!"
}
#调用函数hello2
hello2

执行结果如下:

函数名重复

上面函数定义提到函数名必须唯一,如果不唯一呢,作个验证,将上面的示例代码改下,两个函数名改成一样:hello,如下:

#! /bin/bash

#定义函数hello
function hello
{
	echo "hello, world!"
}
#调用函数hello
hello

#定义函数hello2
function hello
{
	echo "hello, world2!"
}
#调用函数hello2
hello

看下执行结果:

重名的话,后面定义的函数把前面的定义覆盖了

函数参数用法

即使函数要传递参数,函数的定义还是上面定义的格式。调用函数时想要传递参数,用法就和执行脚本一样,在调用函数后以空格分隔设置参数,如下:

function_name arg1 arg2 arg3 ...

如果想要在函数体内获得参数值,使用位置变量获得。

示例如下:

#! /bin/bash

#定义函数hello
hello()
{
	echo "脚本名: $0"
	#打印前3个参数的值
	echo "hello, $1 $2 $3"
}
#调用函数hello
hello 小明 小红

注意一下,这里$0的值是执行的脚本的名字,可不是调用的函数名。获取3个参数,但是我只传递了两个,那个后面的就是空了,执行结果如下:

注意一下,虽然脚本第一行我声明的#!使用bash来解释,但是执行的时候,我是直接使用bash解释执行的,也就是说#!声明不生效的,这是为了$0可以获得执行的当前脚本的名字。

函数返回值 

函数的返回值需要注意以下3点:

  1. 函数的返回值可以使用$?获取,来表示函数的调用状态:成功/失败。默认返回值情况下:0表示成功,非0表示失败,就像命令一样,如下:
#! /bin/bash

#定义函数hello
hello()
{
	echo "脚本名: $0"
	#打印前3个参数的值
	echo "hello, $1 $2 $3"
}
#调用函数hello
hello 小明 小红
echo "函数执行结果:$?"

执行结果:

  1. 使用return返回特定的状态码,但是这个值必须在0-255之间,如下:
#! /bin/bash

less_than_0()
{
	return -1
}

between_0_255()
{ 
	return 100
}

eq_255()
{
	return 255
}

greater_than_255()
{
	return 256
}
less_than_0
echo "less_than_0: $?"
between_0_255
echo "between_0_255: $?"
eq_255
echo "eq_255: $?"
greater_than_255
echo "greater_than_255: $?"

执行结果:

不在0-255的用其它值代替。

  1. 如果这个返回值不是一个数字,而我们用$?获取这个结果,如下:
#! /bin/bash

fun_string_test()
{
	return "hello,world"
}
fun_string_test
echo "fun_string_test: $?"

执行结果:

调用失败,返回值必须是数字类型