Shell脚本中的函数

Shell脚本中的功能是什么?

函数是一组命令,这些命令被赋予一个名称,该名称的作用类似于该组命令的句柄。要执行函数中定义的这组命令,只需使用您提供的名称调用该函数即可。

在某些情况下,您需要执行一个代码块,该代码块在shell脚本的不同位置执行多次特定过程。Shell函数类似于其他编程语言中的子例程,过程和函数。

为什么Shell脚本中的函数?

•它有助于我们重用代码。
•提高程序的可读性。
•在程序内有效使用变量。
•允许我们逐个测试程序。
•将程序显示为一系列子步骤。

要使用的语法:
 Syntax1:
 function function_name
 {
 ###命令集
 }
 Syntax2:
 函数名()
 {
 ####命令集
 }
 
function是声明函数定义的关键工作。
function_name是声明的函数的名称。
Curly braces {}充当包含函数代码的分隔符。
命令集是调用函数时要执行的代码。
因此,首先声明一个函数然后在需要时调用它。

在第一种语法中,您必须使用关键字函数,后跟函数名称以及打开和关闭括号和花括号,以将函数的内容与主例程分开。
在第二种语法中,由函数名称,开括号和闭括号以及花括号组成。

我们有一些shell脚本示例:

在这个例子中,我们将编写一个非常小的函数,用“----”打印一行
 

Shell脚本中的函数

 

 

 

 

 

 

 

 

让我们看看它是如何工作的:
第1行:声明函数   print_line 。
第2行和第4行:{ }   用于分隔函数体的花括号  。
第3行:函数体中唯一的语句:使用echo命令打印一行“---”字符。
第5行:调用该  print_line   函数。
第6行:打印提供的参数   $1 。
第7行:print_line 再次调用该  函数。

注意:$1 在上面的示例中,“  ”将采用以下值,您将在执行脚本时给出参数。
1)  打印“欢迎使用自动化实验室”(它将使用双引号打印整个声明)2)  打印“欢迎使用”(它将仅显示“收件人”声明)3)  打印“欢迎”(它将打印只欢迎)./function.sh “To Automation Laboratories”  

./function.sh To Automation Laboratories  

./function.sh (without any argument)  

让我们再来看一个例子:
 
创建后功能 myfunction的,它然后通过调用其调用函数的名字我们的主程序。主例程将我们的脚本中的任何位置未定义为我们的函数的一部分。
 #!/斌/庆典
 MyFunction的()
 {
 回声 “哦!实际上,它的工作原理“
 }
 MyFunction的
现在让我们重新安排我们的代码来测试函数是否可以在我们的脚本中的任何地方声明。
 #!/斌/庆典
 回声 “用于测试”
 MyFunction的
 MyFunction的()
 {
 回声 “哦!实际上,它的工作原理“
 }
线3  上面的代码段返回没有发现错误的命令。这只意味着:
功能只适用,如果它是你的主程序之前声明。如果您在主程序之后声明了您的功能解释器将返回错误。
函数上传递参数
您可以 bash  函数中传递参数并处理这些数据。下面的代码显示了如何 shell脚本中传递值的过程:
 #!/斌/庆典
 MyFunction的()
 {
 echo “第一个参数是$ 1
 echo “第二个参数是$ 2
 }
 myfunction“你好”“世界”

Shell脚本中的函数

 

让我们理解以上内容:

  1. 在我们调用之后,我们添加了值“Hello”和“World”  myfunction 。

  2. 这些值作为参数传递给myfunction并存储在局部变量中。

  3. 解释器将传递的值存储到预定义变量中,这些变量根据传递参数的顺序命名,1作为起始名称直到传递顺序。

  4. 请注意,“Hello”字存储在变量1中,值“World”存储在变量2中。

注意:上面的1和2是局部变量,因此,除了传递参数的函数之外,脚本的其他部分都无法访问它们。

让我们通过下面的例子来识别上面的注意事项:
 #!/斌/庆典
 MyFunction的()
 {
 echo “第一个参数是$ 1
 echo “第二个参数是$ 2
 }
 myfunction“你好”“世界”
 回声 $ 1
 回声 $ 2

在  echo $1   和  echo $2   我们的脚本的最后两行没有显示,因为解释不承认这两个变量,因为它们都是局部给myFunction。
让我们通过再举一个例子来更清楚地了解这一点:
我们将编写一个估计字符串长度的函数。该字符串将作为参数提供给函数。让我们'看看它会是怎样的。
嗯...在此之前,为什么我们不在Linux中增强一些有用的命令?
“  wc -l ”:计算行数
“  wc -w ”:计算单词数
“  wc -m ”:计算字符数

 

Shell脚本中的函数

 

 

 

 

 

 

 

第2行:声明并初始化变量长度。
第3行:定义函数string_length。
第4行和第6行:功能代码块分隔符。
第5行:函数内唯一的代码行:

length =`echo -n $ 1 | wc -m` 
传递给函数$ 1的参数使用echo命令打印,该命令选项  –n   可防止echo在末尾插入换行符。
命令echo的输出通过–n $1   管道传输到命令  的输入流   wc –m  (它对输入中的字符进行计数)。
上面复合语句的结果是echo -n $ 1 | wc -m被赋予(通过使用反引号'')到可变长度。

第7行:从用户读取输入字符串,并将其分配给变量  STR 。
第8行:调用  string_length 函数并将变量传递  STR   给它。调用该函数的结果是估计STR的长度并将计算的长度存储在可变长度中。
第9行:将结果打印给用户。

Bash函数返回

Bash函数可以使用关键字return将函数的局部变量的值传递给主例程。然后将返回的值存储到默认变量$?我们来举个例子: 

Shell脚本中的函数

我们将参数int1和int2传递给add函数。接下来,该  add  函数通过该行处理它   sum=$(($1+$2)) 。然后sum变量的值通过该行传递给主程序   return $sum 。默认情况下,值   $sum  将存储到默认变量   $ ?最后,行echo  "The result is: " $? 显示结果。

注意:Shell脚本只能返回单个值。

递归函数意味着在函数定义中,并且在函数的代码内部,调用语句可以出现调用函数(被定义)本身。这应该由测试条件控制,以确保功能将收敛。如果没有指定条件,或者使用了错误的条件,该函数将永远调用自身。

现在使用一个因子示例来增强此递归函数:

Shell脚本中的函数

 

 

 

 

 

 

 

 result=1 :此行将变量result初始化为1 
 factorial_function .:声明阶乘函数。
函数体Staring delimiter { 
if [$ 1 -gt1]; 然后检查提供给函数的参数是否大于1. 
如果是,则执行以下两行:

  •  let “result *= $1” :这将结果的当前值乘以传递给函数的参数。

  •  factorial $(($1-1))  :这以递归方式调用阶乘函数,并以$ 1-1作为参数传递给它。
    函数体关闭分隔符}

声明函数后,这又是主脚本代码:
 factorial $1 

主脚本调用阶乘函数并将传递给脚本$ 1的命令行参数传递给它。不要混淆代表第一个命令行参数的$ 1和代表传递给函数的第一个参数的$ 1。
最后一行将结果打印给用户。

1.首先,将结果变量设置为1. 
2.解释器遇到函数定义。
3.使用参数4调用该函数。控件将转移到按以下方式工作的函数:

a)如果参数大于1(这是大小写),则检查参数(现在为4)。如果是,则执行以下两行:

i)完成通常的累加乘法运算:结果乘以参数$ 1,结果存储在变量结果中。
ii)阶乘函数被称为“递归地”并且作为参数传递3。控制再次转移到阶乘函数,其参数现在为3。

b)如果参数“3”大于1(这是大小写),则检查参数“3”。如果是,则执行上述两个步骤(i和ii)。步骤ii再次调用阶乘函数,其中2为参数。
c)这一直持续到使用参数1调用阶乘函数。此时,if条件失败,并且函数终止。

4.控件返回主脚本,执行函数调用后的第一行(即将结果打印给用户的echo命令)。

我们已经讨论过Linux shell脚本中的函数。函数是实现特定任务的代码块。函数可以接受参数或根本不需要参数调用。我们用例子说明了我们的谈话。

我希望你发现这篇文章很有用。

如果您发现任何不正确的内容,或者您​​想要分享有关上述主题的更多信息,请撰写评论。