BASH shell脚本篇4——函数

这篇文章介绍下BASH shell中的函数。之前有介绍过shell的其它命令,请参考:

BASH shell脚本篇1------基本命令

BASH shell脚本篇2------条件命令

BASH shell脚本篇3------字符串处理

函数是代码重用的最重要方式。Bash函数可以定义为一组命令,在bash脚本中多次调用。bash函数使脚本更具可读性,并避免一次又一次地编写相同的代码。它还允许开发人员将复杂而冗长的代码分解为小部分,可以在需要时调用它们。可以随时重复调用函数,这样就能够重用,优化和最小化代码。

1. 函数声明

bash函数必须先声明,然后才能使用它。函数的声明有两种格式:

复制代码
# 第一种方法:以函数名称开头,后跟括号。
function_name () {  
   commands  
}

# 第二种方法:以函数保留字开头,后跟函数名称。
function function_name {  
    commands  
}

2. 函数参数

可以往bash函数中传递参数来处理数据,只需要把要传递的数据放在调用的函数名称之后,在函数名称和参数之间使用空格,为了防止参数解析错误,建议在参数周围使用双引号。

  • 给定的参数以$1$2$3,...$n的形式访问,对应于函数名后参数的位置。
  • $0变量的值是函数的名称。
  • $#变量用于保存赋予函数的位置参数的数量。
  • $*$@变量用于保存赋予函数的所有参数。当$*与双引号(即"$*")一起使用时,它将扩展为一个由空格分隔的字符串。例如,"$1 $2 $n"等。当$@与双引号(即"$@")一起使用时,它将扩展为单独的字符串。例如,"$1" "$2" "$n"等。当$*$#不与双引号一起使用时,它们都是相同的。

例子如下:

bash 复制代码
# The script is:
function_name () {
    echo "the function is called"
    echo '$0 is' $0
    echo '$1 is' $1
    echo '$2 is' $2
    echo '$# is' $#
    echo '$*' is $*
    echo '$@' is $@
}
function_name first second third

# The result is:
the function is called
$0 is ./bash_ex.sh
$1 is first
$2 is second
$# is 3
$* is first second third
$@ is first second third

3. 函数返回值

Bash函数不提供在调用时返回值的支持,但是,它们允许设置返回状态,这种状态类似于程序或命令如何以退出状态退出。bash函数完成时,其返回值是函数中最后执行的语句的状态。对于成功状态,它将返回0,对于失败,将返回1-255范围内的非零十进制数。

可以使用关键字return指示返回状态,并将它分配给变量$?return语句终止函数并用作函数的退出状态。

例子如下:

bash 复制代码
# The script is:
func_return () {
    echo "the function is called"
    return 6
}
func_return
echo "func_return status: $?"

# The result is:
the function is called
func_return status: 6

从函数返回值的另一个更好的选择是使用echoprintf命令将打印值发送到stdout,如下脚本代码所示:

bash 复制代码
# The script is:
func_print () {  
    local it="Welcome!!!"  
    echo "$it"  
}  
my="$(func_print)"  
echo $my

# The result is:
Welcome!!!

4. 变量的作用域

全局变量定义为可以在脚本内的任意位置访问的变量,而不管它的范围如何。默认情况下,所有变量都定义为全局变量,即使它们在函数内部声明也是如此。还可以将变量创建为局部变量。可以使用local关键字在函数体内声明局部变量。首次分配关键字时。它们只能在该函数内部访问。可以在不同的函数中创建具有相同名称的局部变量。要添加局部变量,语法如下:

bash 复制代码
local var_name=<var_value>

例子如下:

bash 复制代码
# The script is:
v1='A'  
v2='B'  
test_local_var () {  
    local v1='C'  
    v2='D'  
    echo "test_local_var Function"  
    echo "v1 is $v1."  
    echo "v2 is $v2."  
}  
echo "Before Executing the Function"  
echo "v1 is $v1."  
echo "v2 is $v2."  
test_local_var 
echo "After Executing the Function"  
echo "v1 is $v1."  
echo "v2 is $v2."

# The result is:
Before Executing the Function
v1 is A.
v2 is B.
test_local_var Function
v1 is C.
v2 is D.
After Executing the Function
v1 is A.
v2 is D.

5. 覆盖命令

可以通过创建与要覆盖的命令同名的函数来覆盖bash命令。例如,如果想覆盖echo命令,那么只需要创建一个名称为echo的函数即可。覆盖bash命令的概念在某些情况下可能会很有用,例如当要使用带有特定选项的命令时,或者当我们不喜欢在脚本中多次为整个命令提供选项时。在这种情况下,可以将内置bash命令覆盖为带选项的命令。

例子如下:

bash 复制代码
# The script is:
echo () {  
    builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "  
    builtin echo $1  
}  
echo "Welcome to Official Accounts"

# The result is:
[09-29 21:56:10] : Welcome to Official Accounts

从上面例子可以看出,echo输出会附带上时间信息。

相关推荐
小糖学代码4 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
shizhan_cloud4 小时前
Shell 函数的知识与实践
linux·运维
Deng8723473484 小时前
代码语法检查工具
linux·服务器·windows
霍夫曼6 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
月熊7 小时前
在root无法通过登录界面进去时,通过原本的普通用户qiujian如何把它修改为自己指定的用户名
linux·运维·服务器
大江东去浪淘尽千古风流人物8 小时前
【DSP】向量化操作的误差来源分析及其经典解决方案
linux·运维·人工智能·算法·vr·dsp开发·mr
赖small强9 小时前
【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析
linux·驱动开发·nor flash·芯片内执行
IT运维爱好者10 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA10 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴10 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生