• BASH shell脚本篇4——函数


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

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

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

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

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

    1. 函数声明

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

    1. # 第一种方法:以函数名称开头,后跟括号。
    2. function_name () {
    3. commands
    4. }
    5. # 第二种方法:以函数保留字开头,后跟函数名称。
    6. function function_name {
    7. commands
    8. }

    2. 函数参数

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

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

    例子如下:

    1. # The script is:
    2. function_name () {
    3. echo "the function is called"
    4. echo '$0 is' $0
    5. echo '$1 is' $1
    6. echo '$2 is' $2
    7. echo '$# is' $#
    8. echo '$*' is $*
    9. echo '$@' is $@
    10. }
    11. function_name first second third
    12. # The result is:
    13. the function is called
    14. $0 is ./bash_ex.sh
    15. $1 is first
    16. $2 is second
    17. $# is 3
    18. $* is first second third
    19. $@ is first second third


    3. 函数返回值

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

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

    例子如下:

    1. # The script is:
    2. func_return () {
    3. echo "the function is called"
    4. return 6
    5. }
    6. func_return
    7. echo "func_return status: $?"
    8. # The result is:
    9. the function is called
    10. func_return status: 6

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

    1. # The script is:
    2. func_print () {
    3. local it="Welcome!!!"
    4. echo "$it"
    5. }
    6. my="$(func_print)"
    7. echo $my
    8. # The result is:
    9. Welcome!!!

    4. 变量的作用域

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

    local var_name=

    例子如下:

    1. # The script is:
    2. v1='A'
    3. v2='B'
    4. test_local_var () {
    5. local v1='C'
    6. v2='D'
    7. echo "test_local_var Function"
    8. echo "v1 is $v1."
    9. echo "v2 is $v2."
    10. }
    11. echo "Before Executing the Function"
    12. echo "v1 is $v1."
    13. echo "v2 is $v2."
    14. test_local_var
    15. echo "After Executing the Function"
    16. echo "v1 is $v1."
    17. echo "v2 is $v2."
    18. # The result is:
    19. Before Executing the Function
    20. v1 is A.
    21. v2 is B.
    22. test_local_var Function
    23. v1 is C.
    24. v2 is D.
    25. After Executing the Function
    26. v1 is A.
    27. v2 is D.

    5. 覆盖命令

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

    例子如下:

    1. # The script is:
    2. echo () {
    3. builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "
    4. builtin echo $1
    5. }
    6. echo "Welcome to Official Accounts"
    7. # The result is:
    8. [09-29 21:56:10] : Welcome to Official Accounts

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

  • 相关阅读:
    数据库系统原理与应用教程(044)—— MySQL 查询(六):使用 LIMIT 选项实现分页查询
    ChatGPT之母:AI自动化将取代人类,创意性工作或将消失
    一、kafka基本原理
    【Spring使用三级缓存解决循环依赖的过程】
    【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
    N点复序列求2个N点实序列的快速傅里叶变换
    有关concat函数的进一步理解
    Java中[Ljava.lang.Object;是什么?
    openGauss通过VIP实现的故障转移
    Pr:代理工作流程
  • 原文地址:https://blog.csdn.net/W1Z1Q/article/details/133418237