如何使用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/bash
myfunc() {
echo "Using functions"
}
total=1
while [ $total -le 3 ]; do
myfunc
total=$(($total + 1))
done
echo "Loop finished"
myfunc
echo "End of the script"
这里我们创建了一个名为 myfunc 的函数,为了调用它,我们只需输入它的名称。
你可以根据需要多次调用该函数。
注意:如果你尝试使用未定义的函数,会发生什么?
#!/bin/bash
total=1
while [ $total -le 3 ]; do
myfunc
total=$(($total + 1))
done
echo "Loop End"
myfunc() {
echo "Using function ..."
}
echo "End of the script"
哦,这是一个错误,因为没有这样的功能。
另一个注意事项:bash 函数名必须是唯一的。否则,新函数将取消旧函数而不会出现任何错误。
#!/bin/bash
myfunc() {
echo "The first function definition"
}
myfunc
function myfunc() {
echo "The second function definition"
}
myfunc
echo "End of the script"
如你所见,第二个函数定义从第一个函数定义中获得控制权,没有任何错误,因此在定义函数时要小心。
如何创建和使用Bash函数:使用return命令
return 命令从函数返回一个整数。
有两种使用返回命令的方法;第一种方式是这样的:
#!/bin/bash
myfunc() {
read -p "Enter a value: " value
echo "adding value"
return $(($value + 10))
}
myfunc
echo "The new value is $?"
myfunc 函数将 $value 变量加 10,然后使用 $? 多变的。
在获取函数值之前不要执行任何命令,因为变量 $? 返回最后一行的状态。
此返回方法返回整数。返回字符串呢?
使用函数输出
从 bash 函数返回值的第二种方法是命令替换。这样,你可以从函数中返回任何内容。
#!/bin/bash
myfunc() {
read -p "Enter a value: " value
echo $(($value + 10))
}
result=$(myfunc)
echo "The value is $result"
传递参数
如何创建Bash函数?我们可以像处理可以重用的小片段一样处理 bash 函数,这没关系,但是我们需要让函数像引擎一样,我们给它一些东西,它根据我们提供的东西返回一个结果。
你可以使用环境变量来处理传递给函数的参数。函数名声明为$0变量,传递的参数为$1、$2、$3等。
你可以使用 ( $# ) 变量获取传递给函数的参数数量。
我们像这样传递参数:
myfunc $val1 10 20
以下示例显示了如何使用 ($#) 变量:
#!/bin/bash
addnum() {
if [ $# -gt 2 ]; then
echo "Incorrect parameters passed" # If parameters no equal 2
else
echo $(($1 + $2)) # Otherwise add them
fi
}
echo -n "Adding 10 and 15: "
value=$(addnum 10 15)
echo $value
echo -n "Adding three numbers: "
value=$(addnum 10 15 20)
echo $value
如何使用Bash函数?addnum 函数获取传递参数的计数。如果大于 2,则返回 -1。
如果有一个参数,addnum 函数会将该参数添加两次。如果传递了两个参数,addnum 函数会将它们相加,如果尝试将三个参数相加,则会返回 -1。
如果你尝试在函数内部使用传递的参数,则会失败:
#!/bin/bash
myfunc() {
echo $(($1 + $2 + $3 + $4))
}
if [ $# -eq 4 ]; then
value=$(myfunc)
echo "Total= $value"
else
echo "Passed parameters like this: myfunc a b c d"
fi
相反,你必须像这样将它们发送到函数:
#!/bin/bash
myfunc() {
echo $(($1 + $2 + $3 + $4))
}
if [ $# -eq 4 ]; then
value=$(myfunc $1 $2 $3 $4)
echo "Total= $value"
else
echo "Passed parameters like this: myfunc a b c d"
fi
现在它起作用了!!
Bash脚本教程:Bash 函数中的处理变量
我们使用的每个变量都有一个作用域;范围是你的脚本的可变可见性。
你可以定义两种类型的变量:
- 全局变量
- 本地变量
全局变量
它们在 bash 脚本中的任何地方都可见且有效。你甚至可以从函数内部获取它的值。
如果在函数内声明全局变量,则可以从函数外部获取其值。
默认情况下,你声明的任何变量都是全局变量。如果在函数外定义变量,则在函数内调用它没有问题:
#!/bin/bash
myfunc() {
input=$(($input + 10))
}
read -p "Enter a number: " input
myfunc
echo "The new value is: $input"
如果你在函数内部更改变量值,则该值将在函数外部更改。
那么如何克服这样的事情呢?使用局部变量。
如何创建和使用Bash函数?局部变量
如果只在函数内部使用该变量,则可以使用 local 关键字将其声明为局部变量,如下所示:
local tmp=$(( $val + 10 ))
因此,如果你有两个变量,一个在函数内部,另一个在函数外部,并且它们具有相同的名称,则它们不会相互影响。
#!/bin/bash
myfunc() {
local tmp=$(($val + 10))
echo "The Temp from inside function is $tmp"
}
tmp=4
myfunc
echo "The temp from outside is $tmp"
当你在 myfunc 函数内部使用 $tmp 变量时,它不会更改 $tmp 的值,该值位于函数外部。
将数组作为参数传递
如果将数组作为参数传递给函数会发生什么:
#!/bin/bash
myfunc() {
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[*]}
该函数仅采用数组变量的第一个值。
你应该将数组分解为单个值,然后将这些值用作函数参数。最后,将它们打包到函数中的数组中,如下所示:
#!/bin/bash
myfunc() {
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脚本教程:递归函数
此功能使函数能够从函数本身内部调用自身。
递归函数的经典示例是计算阶乘。要计算 3 的阶乘,请使用以下等式:
3!= 1 * 2 * 3
相反,我们可以像这样使用递归函数:
x! = x * (x-1)!
所以要使用 bash 脚本编写阶乘函数,它将是这样的:
#!/bin/bash
fac_func() {
if [ $1 -eq 1 ]; then
echo 1
else
local tmp=$(($1 - 1))
local res=$(fac_func $tmp)
echo $(($res * $1))
fi
}
read -p "Enter value: " val
res=$(fac_func $val)
echo "The factorial of $val is: $res"
使用递归 bash 函数是如此简单!
如何创建Bash函数?创建库
现在我们知道如何编写函数以及如何调用它们,但是如果你想在不同的 bash 脚本文件上使用这些 bash 函数或代码块而不将其复制并粘贴到你的文件上,该怎么办。
你可以为你的函数创建一个库,并根据需要从任何文件指向该库。
通过使用source 命令,你可以将库文件脚本嵌入到你的 shell 脚本中。
source 命令有一个别名,即点。要在 shell 脚本中获取文件,请编写以下行:
. ./myscript
假设我们有一个名为 myfuncs 的文件,其中包含以下内容:
addnum() {
echo $(($1 + $2 + $3 + $4))
}
现在,我们将在另一个 bash 脚本文件中使用它,如下所示:
#!/bin/bash
. ./myfuncs
result=$(addnum 10 10 5 5)
echo "Total = $result"
惊人的!!我们在 bash 脚本文件中使用了 bash 函数;我们也可以直接在我们的 shell 中使用它们。
如何使用Bash函数?从命令行使用 Bash 函数
如何创建和使用Bash函数?嗯,这很简单,如果你阅读上一篇关于信号和作业的文章,你将了解如何在 bashrc 文件中获取我们的函数文件,因此我们可以直接从 bash shell 使用这些函数. 凉爽的
编辑 /home/username 中的 bashrc 文件并添加以下行:
. /home/likegeeks/Desktop/myfuncs
确保键入正确的路径。
现在该函数可供我们直接在命令行中使用:
$ addnum 10 20
注意:你可能需要注销并登录才能从 shell 使用 bash 功能。
另一个注意事项:如果你将函数名称命名为任何内置命令,你将覆盖默认命令,因此你应该注意这一点。
我希望你喜欢这个Bash脚本教程,若有任何问题,请在下方评论。
谢谢阅读。