Bash脚本教程:如何创建和使用Bash函数?

2021年9月15日23:06:13 发表评论 816 次浏览

如何使用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 的函数,为了调用它,我们只需输入它的名称。

Bash脚本教程:如何创建和使用Bash函数?

你可以根据需要多次调用该函数。

注意:如果你尝试使用未定义的函数,会发生什么?

#!/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脚本教程:如何创建和使用Bash函数?

哦,这是一个错误,因为没有这样的功能。

另一个注意事项:bash 函数名必须是唯一的。否则,新函数将取消旧函数而不会出现任何错误。

#!/bin/bash

myfunc() {

	echo "The first function definition"

}

myfunc

function myfunc() {

	echo "The second function definition"

}

myfunc

echo "End of the script"
Bash脚本教程:如何创建和使用Bash函数?

如你所见,第二个函数定义从第一个函数定义中获得控制权,没有任何错误,因此在定义函数时要小心。

如何创建和使用Bash函数:使用return命令

return 命令从函数返回一个整数。

有两种使用返回命令的方法;第一种方式是这样的:

#!/bin/bash

myfunc() {

	read -p "Enter a value: " value

	echo "adding value"

	return $(($value + 10))

}

myfunc

echo "The new value is $?"
Bash脚本教程:如何创建和使用Bash函数?

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函数?

传递参数

如何创建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脚本教程:如何创建和使用Bash函数?

如何使用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
Bash脚本教程:如何创建和使用Bash函数?

相反,你必须像这样将它们发送到函数:

#!/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脚本教程:Bash 函数中的处理变量

我们使用的每个变量都有一个作用域;范围是你的脚本的可变可见性。

你可以定义两种类型的变量:

  • 全局变量
  • 本地变量

全局变量

它们在 bash 脚本中的任何地方都可见且有效。你甚至可以从函数内部获取它的值。

如果在函数内声明全局变量,则可以从函数外部获取其值。

默认情况下,你声明的任何变量都是全局变量。如果在函数外定义变量,则在函数内调用它没有问题:

#!/bin/bash

myfunc() {

	input=$(($input + 10))

}

read -p "Enter a number: " input

myfunc

echo "The new value is: $input"
Bash脚本教程:如何创建和使用Bash函数?

如果你在函数内部更改变量值,则该值将在函数外部更改。

那么如何克服这样的事情呢?使用局部变量。

如何创建和使用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"
Bash脚本教程:如何创建和使用Bash函数?

当你在 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[*]}
Bash脚本教程:如何创建和使用Bash函数?

该函数仅采用数组变量的第一个值。

你应该将数组分解为单个值,然后将这些值用作函数参数。最后,将它们打包到函数中的数组中,如下所示:

#!/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脚本教程:如何创建和使用Bash函数?

由于该函数,数组变量被重建。

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函数?创建库

现在我们知道如何编写函数以及如何调用它们,但是如果你想在不同的 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函数?

惊人的!!我们在 bash 脚本文件中使用了 bash 函数;我们也可以直接在我们的 shell 中使用它们。

如何使用Bash函数?从命令行使用 Bash 函数

如何创建和使用Bash函数?嗯,这很简单,如果你阅读上一篇关于信号和作业的文章,你将了解如何在 bashrc 文件中获取我们的函数文件,因此我们可以直接从 bash shell 使用这些函数. 凉爽的

编辑 /home/username 中的 bashrc 文件并添加以下行:

. /home/likegeeks/Desktop/myfuncs

确保键入正确的路径。

现在该函数可供我们直接在命令行中使用:

$ addnum 10 20
Bash脚本教程:如何创建和使用Bash函数?

注意:你可能需要注销并登录才能从 shell 使用 bash 功能。

另一个注意事项:如果你将函数名称命名为任何内置命令,你将覆盖默认命令,因此你应该注意这一点。

我希望你喜欢这个Bash脚本教程,若有任何问题,请在下方评论。

谢谢阅读。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: