Bash脚本教程(如何创建和使用Bash函数())

如何使用Bash函数?在讨论 bash 函数之前,我们先讨论一下这种情况。在编写 bash 脚本时,你会发现自己在多个地方使用了相同的代码。
如果你厌倦了在 bash 脚本中一遍又一遍地编写相同的代码行,那么最好编写一次代码块并在 bash 脚本中的任何位置调用它。
bash shell 允许你使用函数做到这一点,那么如何创建和使用Bash函数呢?
Bash 函数是代码块,你可以在代码中的任何位置重用它们。无论何时你想在脚本中使用此代码块,你只需键入为其指定的函数名称。
如何创建Bash函数?在这篇Bash脚本教程中,我们将讨论如何创建 bash 函数以及如何在 shell 脚本中使用它们。
目录

  • 创建函数
  • 使用函数
  • 使用返回命令
  • 使用函数输出
  • 传递参数
  • Bash 函数中的处理变量
    • 全局变量
    • 局部变量
  • 将数组作为参数传递
  • 递归函数
  • 创建库
  • 从命令行使用 Bash 函数
创建函数你可以像这样定义一个函数:
functionName() {}

需要括号 () 来定义函数。
此外,你可以使用 function 关键字定义函数,但为了 POSIX 可移植性,不推荐使用此关键字。
function functionName() { # Deprecated definition but still used and working}

在第二个定义中,不需要括号。
使用函数
#!/bin/bashmyfunc() { echo "Using functions"}total=1while [ $total -le 3 ]; do myfunc total=$(($total + 1))doneecho "Loop finished"myfuncecho "End of the script"

这里我们创建了一个名为 myfunc 的函数,为了调用它,我们只需输入它的名称。
Bash脚本教程(如何创建和使用Bash函数())

文章图片
你可以根据需要多次调用该函数。
注意:如果你尝试使用未定义的函数,会发生什么?
#!/bin/bashtotal=1while [ $total -le 3 ]; do myfunc total=$(($total + 1))doneecho "Loop End"myfunc() { echo "Using function ..."}echo "End of the script"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
哦,这是一个错误,因为没有这样的功能。
另一个注意事项:bash 函数名必须是唯一的。否则,新函数将取消旧函数而不会出现任何错误。
#!/bin/bashmyfunc() { echo "The first function definition"}myfuncfunction myfunc() { echo "The second function definition"}myfuncecho "End of the script"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
如你所见,第二个函数定义从第一个函数定义中获得控制权,没有任何错误,因此在定义函数时要小心。
如何创建和使用Bash函数:使用return命令return 命令从函数返回一个整数。
有两种使用返回命令的方法;第一种方式是这样的:
#!/bin/bashmyfunc() { read -p "Enter a value: " value echo "adding value" return $(($value + 10))}myfuncecho "The new value is $?"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
myfunc 函数将 $value 变量加 10,然后使用 $?  多变的。
在获取函数值之前不要执行任何命令,因为变量 $?  返回最后一行的状态。
此返回方法返回整数。返回字符串呢?
使用函数输出从 bash 函数返回值的第二种方法是命令替换。这样,你可以从函数中返回任何内容。
#!/bin/bashmyfunc() { read -p "Enter a value: " value echo $(($value + 10))}result=$(myfunc)echo "The value is $result"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
传递参数如何创建Bash函数?我们可以像处理可以重用的小片段一样处理 bash 函数,这没关系,但是我们需要让函数像引擎一样,我们给它一些东西,它根据我们提供的东西返回一个结果。
你可以使用环境变量来处理传递给函数的参数。函数名声明为$0变量,传递的参数为$1、$2、$3等。
你可以使用 (  $#  ) 变量获取传递给函数的参数数量。
我们像这样传递参数:
myfunc $val1 10 20

以下示例显示了如何使用 ($#) 变量:
#!/bin/bashaddnum() { if [ $# -gt 2 ]; thenecho "Incorrect parameters passed" # If parameters no equal 2 elseecho $(($1 + $2)) # Otherwise add them fi}echo -n "Adding 10 and 15: "value=https://www.lsbin.com/$(addnum 10 15)echo $valueecho -n"Adding three numbers: "value=https://www.lsbin.com/$(addnum 10 15 20)echo $value

Bash脚本教程(如何创建和使用Bash函数())

文章图片
如何使用Bash函数?addnum 函数获取传递参数的计数。如果大于 2,则返回 -1。
如果有一个参数,addnum 函数会将该参数添加两次。如果传递了两个参数,addnum 函数会将它们相加,如果尝试将三个参数相加,则会返回 -1。
如果你尝试在函数内部使用传递的参数,则会失败:
#!/bin/bashmyfunc() { echo $(($1 + $2 + $3 + $4))}if [ $# -eq 4 ]; then value=https://www.lsbin.com/$(myfunc) echo"Total= $value"else echo "Passed parameters like this: myfunc a b c d"fi

Bash脚本教程(如何创建和使用Bash函数())

文章图片
相反,你必须像这样将它们发送到函数:
#!/bin/bashmyfunc() { echo $(($1 + $2 + $3 + $4))}if [ $# -eq 4 ]; then value=https://www.lsbin.com/$(myfunc $1 $2 $3 $4) echo"Total= $value"else echo "Passed parameters like this: myfunc a b c d"fi

Bash脚本教程(如何创建和使用Bash函数())

文章图片
现在它起作用了!!
Bash脚本教程:Bash 函数中的处理变量我们使用的每个变量都有一个作用域;范围是你的脚本的可变可见性。
你可以定义两种类型的变量:
  • 全局变量
  • 本地变量
全局变量
它们在 bash 脚本中的任何地方都可见且有效。你甚至可以从函数内部获取它的值。
如果在函数内声明全局变量,则可以从函数外部获取其值。
默认情况下,你声明的任何变量都是全局变量。如果在函数外定义变量,则在函数内调用它没有问题:
#!/bin/bashmyfunc() { input=$(($input + 10))}read -p "Enter a number: " inputmyfuncecho "The new value is: $input"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
如果你在函数内部更改变量值,则该值将在函数外部更改。
那么如何克服这样的事情呢?使用局部变量。
如何创建和使用Bash函数?局部变量
如果只在函数内部使用该变量,则可以使用 local 关键字将其声明为局部变量,如下所示:
local tmp=$(( $val + 10 ))

因此,如果你有两个变量,一个在函数内部,另一个在函数外部,并且它们具有相同的名称,则它们不会相互影响。
#!/bin/bashmyfunc() { local tmp=$(($val + 10)) echo "The Temp from inside function is $tmp"}tmp=4myfuncecho "The temp from outside is $tmp"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
【Bash脚本教程(如何创建和使用Bash函数())】当你在 myfunc 函数内部使用 $tmp 变量时,它不会更改 $tmp 的值,该值位于函数外部。
将数组作为参数传递如果将数组作为参数传递给函数会发生什么:
#!/bin/bashmyfunc() { echo "The parameters are: $@" arr=$1 echo "The received array is ${arr[ *]}"}my_arr=(5 10 15)echo "The old array is: ${my_arr[ *]}"myfunc ${my_arr[ *]}

Bash脚本教程(如何创建和使用Bash函数())

文章图片
该函数仅采用数组变量的第一个值。
你应该将数组分解为单个值,然后将这些值用作函数参数。最后,将它们打包到函数中的数组中,如下所示:
#!/bin/bashmyfunc() { local new_arr new_arr=("$@") echo "Updated value is: ${new_arr[ *]}"}my_arr=(4 5 6)echo "Old array is ${my_arr[ *]}"myfunc ${my_arr[ *]}

Bash脚本教程(如何创建和使用Bash函数())

文章图片
由于该函数,数组变量被重建。
Bash脚本教程:递归函数此功能使函数能够从函数本身内部调用自身。
递归函数的经典示例是计算阶乘。要计算 3 的阶乘,请使用以下等式:
3!= 1 * 2 * 3
相反,我们可以像这样使用递归函数:
x! = x * (x-1)!

所以要使用 bash 脚本编写阶乘函数,它将是这样的:
#!/bin/bashfac_func() { if [ $1 -eq 1 ]; thenecho 1 elselocal tmp=$(($1 - 1))local res=$(fac_func $tmp)echo $(($res * $1)) fi}read -p "Enter value: " valres=$(fac_func $val)echo "The factorial of $val is: $res"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
使用递归 bash 函数是如此简单!
如何创建Bash函数?创建库现在我们知道如何编写函数以及如何调用它们,但是如果你想在不同的 bash 脚本文件上使用这些 bash 函数或代码块而不将其复制并粘贴到你的文件上,该怎么办。
你可以为你的函数创建一个库,并根据需要从任何文件指向该库。
通过使用source 命令,你可以将库文件脚本嵌入到你的 shell 脚本中。
source 命令有一个别名,即点要在 shell 脚本中获取文件,请编写以下行:
. ./myscript

假设我们有一个名为 myfuncs 的文件,其中包含以下内容:
addnum() { echo $(($1 + $2 + $3 + $4))}

现在,我们将在另一个 bash 脚本文件中使用它,如下所示:
#!/bin/bash. ./myfuncsresult=$(addnum 10 10 5 5)echo "Total = $result"

Bash脚本教程(如何创建和使用Bash函数())

文章图片
惊人的!!我们在 bash 脚本文件中使用了 bash 函数;我们也可以直接在我们的 shell 中使用它们。
如何使用Bash函数?从命令行使用 Bash 函数如何创建和使用Bash函数?嗯,这很简单,如果你阅读上一篇关于信号和作业的文章,你将了解如何在 bashrc 文件中获取我们的函数文件,因此我们可以直接从 bash shell 使用这些函数. 凉爽的
编辑 /home/username 中的 bashrc 文件并添加以下行:
. /home/likegeeks/Desktop/myfuncs

确保键入正确的路径。
现在该函数可供我们直接在命令行中使用:
$ addnum 10 20

Bash脚本教程(如何创建和使用Bash函数())

文章图片
注意:你可能需要注销并登录才能从 shell 使用 bash 功能。
另一个注意事项:如果你将函数名称命名为任何内置命令,你将覆盖默认命令,因此你应该注意这一点。
我希望你喜欢这个Bash脚本教程,若有任何问题,请在下方评论。
谢谢阅读。

    推荐阅读