Redian新闻
>
Bash 基础知识系列 #9:Bash 中的函数 | Linux 中国

Bash 基础知识系列 #9:Bash 中的函数 | Linux 中国

科技
 
导读:在 Bash 基础系列的最后一章中学习函数的全部知识。                               
本文字数:2678,阅读时长大约:3分钟

https://linux.cn/article-16116-1.html
作者:Abhishek Prakash
译者:ChatGPT

在 Bash 基础系列的最后一章中学习函数的全部知识。

大多数编程语言都支持函数的概念。

函数帮助你避免在同一个程序中反复编写同一段代码。你只需将代码写为一个函数,然后在需要特定代码片段的地方使用这个函数。

在 Bash 基础知识系列的最后一章中,你将学习在 Bash 脚本中使用函数。

Bash 中的函数

下面是声明 Bash 函数的通用语法:

  1. function_name() {
  2. commands
  3. }

只有在 “调用函数” 的脚本中,函数内的命令才会被执行。

这里有一个伪代码来演示这个情况:

  1. function_name() {
  2. commands
  3. }
  4. some_other_commands
  5. # 函数调用
  6. function_name argument;

🚧 函数定义必须在你调用函数之前。

让我们通过一个简单的例子来看看这个:

  1. #!/bin/bash
  2. fun() {
  3. echo "This is a function"
  4. }
  5. echo "This is a script"
  6. fun

当你运行脚本时,你应该看到这样的输出:

  1. This is a script
  2. This is a function

函数是在没有任何参数的情况下被调用的。接下来,让我们看看在 bash 中如何处理函数的参数。

向函数传递参数

向函数传递参数和向 Bash 脚本传递参数是一样的。你在调用函数时,可以在函数名旁边写上参数。

  1. function_name argument;

让我们用一个例子来看看这个:

  1. #!/bin/bash
  2. sum() {
  3. sum=$(($1+$2))
  4. echo "The sum of $1 and $2 is: $sum"
  5. }
  6. echo "Let's use the sum function"
  7. sum 1 5

如果你运行这个脚本,你会看到以下输出:

  1. Let's use the sum function
  2. The sum of 1 and 5 is: 6

请记住,传递给脚本的参数和传递给函数的参数是不同的。

在下面的例子中,我在调用函数时交换了参数。

  1. #!/bin/bash
  2. arg() {
  3. echo "1st argument to function is $1 and 2nd is $2"
  4. }
  5. echo "1st argument to script is $1 and 2nd is $2"
  6. arg $2 $1

当你运行这个脚本时,你会看到这样的交换:

  1. $ ./function.sh abhi shek
  2. 1st argument to script is abhi and 2nd is shek
  3. 1st argument to function is shek and 2nd is abhi

Bash 中的递归函数

一个递归函数会调用它自己。这就是递归的含义。这个梗图可能会帮助你理解它。

递归功能非常强大,可以帮助你编写复杂的程序。

让我们用一个计算阶乘的样本脚本来看看它的应用。如果你忘记了,阶乘的定义是这样的。

n 的阶乘:

  1. (n!) = 1 * 2 * 3 * 4 *... * n

所以,5 的阶乘是 1 * 2 * 3 * 4 * 5,计算结果是 120。

这是我用递归计算给定数字的阶乘的脚本。

  1. #!/bin/bash
  2. factorial() {
  3. if [ $1 -gt 1 ]; then
  4. echo $(( $1 * $(factorial $(( $1 -1 ))) ))
  5. else
  6. echo 1
  7. fi
  8. }
  9. echo -n "Factorial of $1 is: "
  10. factorial $1

注意到 echo $(( $1 * $(factorial $(( $1 -1 ))) )),代码使用比输入值小 1 的值调用了函数自身。这个过程会一直持续到值变为 1。所以,如果你运行脚本并输入参数 5,它最终会返回 5 * 4 * 3 * 2 *1 的结果。

  1. $ ./factorial.sh 5
  2. Factorial of 5 is: 120

非常好。现在,让我们来做些练习吧。

🏋️ 练习时间

以下是一些示例编程挑战,用来帮助你实践你所学。

练习 1:写一个 Bash 脚本,使用一个名为 is_even 的函数来检查给定的数字是否是偶数。

练习 2:类似的练习,你需要编写一个脚本,该脚本具有一个名为 is_prime 的函数,并检查给定数字是否是质数。如果你还不知道,质数只能被 1 和它自身整除。

练习 3:编写一个生成给定数字的斐波那契序列的脚本。序列从 1 开始,脚本必须接受大于 3 的数字。

所以,如果你运行 fibonacci.sh 5,它应该输出 “1 1 2 3 5”。

就这些了,伙计们!这是 Bash 基础系列的最后一节。当然,你在这里学到的只是冰山一角;Bash 编程还有更多需要学习的内容。

但是现在,你应该对 Bash Shell 有了一定的理解。你应该能够理解大多数 Bash 脚本,并能编写简单的脚本,即便不能编写复杂的。

如果你想深入学习,没有什么比阅读 GNU Bash 手册更好的了。

GNU Bash 手册🔗 www.gnu.org

🗨 希望你喜欢这个 Bash 基础知识系列。我们正在创建更多的教程系列,以给你提供更流畅的学习体验。请提供你的反馈,帮助我们帮助其他人学习 Linux。

(题图:MJ/f0022a50-85fe-40cc-afdd-285d976ec98c)


via: https://itsfoss.com/bash-function/

作者:Abhishek Prakash 选题:lujun9972 译者:ChatGPT 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
修复 Arch Linux 中的 “Bash: man command not found” 错误 | Linux 中国【初中物理】初二、三物理基础知识分类汇编服务器基础知识大科普GDB 调试器如何通过调用帧信息来确定函数调用关系 | Linux 中国Bash 基础知识系列 #7:If Else 语句 | Linux 中国Bash 基础知识系列 #5:在 Bash 中使用数组 | Linux 中国雷达干扰的基础知识终端基础:Linux 终端中的目录切换 | Linux 中国存储系统基础知识全解(预告)2023养狗遛狗基础知识考试(全国卷)Bash 基础知识系列 #8:For、While 和 Until 循环 | Linux 中国Bash 基础知识系列 #6:处理字符串操作 | Linux 中国Bash 基础知识系列 #3:传递参数和接受用户输入 | Linux 中国90%的人不知道!这个自动生成随机数的函数太好用了!Linux 中的模糊文件搜索 | Linux 中国Linux 游戏的下一个秘密武器:Bottles Next | Linux 中国更新下载:存储系统基础知识全解(终极版)端阳节怀古你好,我是筚(bì)篥( lì)!Linux 中的 ls 命令使用教程 | Linux 中国存储系统基础知识全解(终极版)算力网络基础知识(2023)一文详解云计算基础知识Bash 基础知识系列 #2:在 Bash 中使用变量 | 技术无题长篇小说《如絮》第一百三十九章 哈尔滨-1957年 2 出逃Linux Shell 介绍:Bash、Zsh 和 Fish | Linux 中国存储芯片技术基础知识介绍(2023)Web 安全基础知识梳理(附PDF)终端基础:在 Linux 中复制文件和目录 | Linux 中国胜利大会师 – 厉害的老妈在香港 (上)罗马文明的基本脉络 (二)复旦大学、中国科学院团队综述,化学机器学习:基础知识和应用如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹 | Linux 中国一文详解信创基础知识
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。