在Shell脚本中理解和编写函数 - 第六部分

函数在任何编程语言中都起着重要的作用。 像许多真正的编程语言一样,bash具有用于有限实现的函数。

了解Linux Shell脚本函数

什么是功能?

在编程中,函数是执行特定任务的程序的命名段。 在这个意义上,函数是一种过程或例程。 当调用函数时,程序离开当前代码段,并开始执行函数内的第一行。 每当有重复代码或任务重复时,请考虑使用函数。

例如,考虑我们需要在特定程序的几个阶段找到数字的阶乘的情况。 不是每次都编写整个代码(用于计算阶乘),而是可以编写代码的一部分,该代码在块中计算阶乘,并在多个场合重复使用。

为什么我们写函数?

  1. 它帮助我们重用代码。
  2. 提高程序的可读性。
  3. 在程序中有效地使用变量。
  4. 允许我们按部分测试程序。
  5. 将程序显示为一系列子步骤。
shell脚本中的函数

在shell脚本中编写函数的一般语法包括以下方法。

function func_name {
. . .
commands
. . .
}
or
func_name ( ) {
. . .
commands
. . .
}
Opening curly braces can also be used in the second line as well.
func_name ( )
{
. . .
commands
. . .
}

您可以随时在这些功能块中编写有效的命令,正如我们在shell脚本中所做的那样。 现在让我们尝试写一个简单的脚本,其中有一个小函数。

#!/bin/bash
call_echo ( ) {
echo ‘This is inside function’
}
op=$1
if [ $# -ne 1 ]; then
echo "Usage: $0 <1/0>"
else
if [ $1 = 0 ] ; then
echo ‘This is outside function’
elif [ $1 = 1 ] ; then
call_echo
else
echo ‘Invalid argument’
fi
fi
exit 0

函数定义必须在对它的第一次调用之前。 在调用它之前没有什么像“声明函数”。 我们可以总是在函数内嵌套函数。

: -编写空函数总是会导致语法错误。

当相同的函数被定义多次时,最终版本是被调用的。 让我们举个例子。

#!/bin/bash
func_same ( ) {
echo ‘First definition’
}
func_same ( ) {
echo ‘Second definition’
}
func_same
exit 0
接受参数和返回值的函数

让我们通过考虑函数接受参数和返回值来更深入。 要从函数返回一个值,我们使用'return'shell内置函数。 语法如下。

func_name ( ) {
. . .
commands
. . .
return $ret_val
}

类似地,我们可以将参数传递给用空格分隔的函数,如下所示。

func_name $arg_1 $arg_2 $arg_3

在函数内部,我们可以按照$ 1,$ 2,$ 3等顺序访问参数。 看下面的示例脚本,找到最多两个整数,使用函数添加更多的清晰度。

#!/bin/bash
USG_ERR=7
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
echo $1
else
echo $2
fi
}
err_str ( ) {
echo "Usage: $0 <number1>  <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
max_two $NUM_1 $NUM_2
else
err_str
fi
else
err_str
fi
exit 0

上面看起来有点复杂,但很简单,如果我们通过线阅读。 第一个嵌套if-else如果行用于验证目的,即在正则表达式的帮助下检查参数的数量和类型。 之后,我们使用两个命令行参数调用该函数,并在其中显示结果。 这是因为我们不能从函数返回大整数。 解决这个问题的另一种方法是使用全局变量来存储结果内部函数。 下面的脚本解释了这种方法。

#!/bin/bash
USG_ERR=7
ret_val=
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
ret_val=$1
else
ret_val=$2
fi
}
err_str ( ) {
echo "Usage: $0 <number1>  <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
max_two $NUM_1 $NUM_2
echo $ret_val
else
err_str
fi
else
err_str
fi
exit 0

现在尝试一些激动人心的问题,在以前的shell脚本系列中使用如下功能解释。

  1. 了解基本的Linux Shell脚本语言提示 - 第一部分
  2. 5 Shell脚本Linux新手学习Shell编程 - 第二部分
  3. 航行通过Linux的世界BASH脚本 - 第三部分
  4. Linux Shell编程的数学方面 - 第四部分
  5. 计算Shell脚本语言中的数学表达式 - 第五部分

我将回到更多的洞察功能功能,如使用局部变量,递归等在下一部分。 保持更新评论。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏