2023年8月

英伟达显卡 BIOS 签名锁被破解

十年来,英伟达一直利用其显卡的 BIOS 签名检查来提高其设备 vBIOS 和固件的安全性。但这导致开源的 Nouveau 驱动程序受到限制,只能以较低的启动时钟频率运行。以至于 GeForce GTX 700 系列仍然是开源 Nouveau 驱动程序支持最好的系列。现在,TechPowerUP 发布的运行在 Windows 上的工具破解了英伟达 BIOS 签名锁,可以支持 vBIOS 修改和与新一代 GPU 的交叉刷新。这个签名锁的破解是否会对 Nouveau 开发人员产生有意义的影响还不确定,但有可能不会,因为存在法律灰色地带。

消息来源:Phoronix
老王点评:如果签名锁的机制被进一步披露,或许开源的英伟达显卡驱动会有质的变化。

现在可以在 Excel 中使用 Python

微软发布了 Python in Excel 的公开预览版,无需任何设置就可以在同一工作簿中结合 Python 和 Excel 分析。使用新的 PY() 函数,用户可以直接在单元格中输入 Python 代码,Python 计算在微软云中运行,计算结果会返回到工作表中。用户也可以利用 Python 图表库创建各种专业可视化图表,进行机器学习、预测分析、数据清理等工作。Python 之父退休后在微软任职,他帮助定义了 Python in Excel 的架构。他说,“当我三年前加入微软时,我做梦也想不到会有这种可能。”

消息来源:微软
老王点评:这确实是一种奇妙的组合,两种最常用的数据分析方式结合在一起了。只是,VBA 以后怎么办?

用人工智能工具将旧的 COBOL 代码转换为 Java

IBM 称,有数十亿行 COBOL 代码可能需要进行现代化处理,这包括重构 COBOL 中的业务服务,将代码转换为 Java 代码,然后借助自动测试验证结果。IBM 将于 2023 年推出一个生成式人工智能工具,以加快 IBM Z 大型机上 COBOL 到 Java 的翻译速度。它生成的 Java 代码是面向对象的,但仍可以与 COBOL 应用程序的其余部分以及 CICS、IMS、DB2 等关键服务和其他 z/OS 运行时进行互操作。

消息来源:The Register
老王点评:这样的话,就不用担心当那些 COBOL 程序员逐渐老了甚至去世,没人维护那些几十年前的银行基础设施了。

初学者们,让我们在这个大型的教程中来认识一下 Bash 脚本编程。

Shell 是 Linux 的核心部分,它允许你使用各种诸如 cdlscat 等的命令与 Linux 内核进行交互。

Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同,但并非完全一样。Bash 是目前最受欢迎的 Shell,并在大多数 Linux 发行版中被设为默认 Shell。

当你打开一个终端或 SSH 会话时,即使你无法真切地看到它,你其实已经在运行着一个 Shell。

当你输入一个命令,它会被 Shell 解释。如果命令和语法是正确的,它就会被执行,否则你会看到一个错误。

当你可以直接运行 Linux 命令时,为什么还需要 Bash 脚本?

你可以直接在终端输入命令,它们就会被执行。

$ echo "hello world"
hello world

并且,同样的操作也可以在脚本中进行:

$ cat >> script.sh
#!/bin/bash

echo "hello world"
$ bash script.sh
hello world

那么,为什么我们需要 Shell 脚本呢?因为你不必一遍又一遍地输入同一个命令,你只需运行 Shell 脚本即可。

此外,如果你的脚本中有复杂的逻辑,把所有的命令都输入到终端中可能并不是一个好主意。

例如,如果你输入下面的命令,它会奏效,但这并不容易理解。不断地输入相同的命令(甚至要在 Bash 历史记录中搜索)会造成困扰。

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

相反,你可以把命令放进 shell 脚本中,这样就更容易理解并且可以轻松运行了:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi

这还是比较简单的情况。尝试想象一下,一个复杂的脚本可能有五十行或一百行!

你将会学到什么?

在这个 Bash 脚本教程中,有九个部分。你将会学到:

  • 创建并运行你的第一个 Bash Shell 脚本
  • 使用变量
  • 在你的 Bash 脚本中传递参数和接受用户输入
  • 进行数学计算
  • 操作字符串
  • 使用条件语句,例如 if-else
  • 使用 forwhileuntil 循环
  • 创建函数
? 所有的部分都会给你一个简单的例子。如果你愿意,你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。

这个教程的目标读者是谁?

这个教程适合任何想要开始学习 Bash Shell 脚本的人。

如果你是一名学生,而你的课程里包括了 Shell 脚本,那么这个系列就是为你准备的。

如果你是一个常规的桌面 Linux 用户,这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。

在这个 Bash 脚本教程结束时,你应该可以编写简单的 Bash 脚本。

? 希望你已经拥有 Linux 命令行和编程语言的基础知识。

如果你对 Linux 命令行完全不熟悉,我建议你先掌握基础知识。

19 个你应该知道的基础而重要的 Linux 终端技巧

你应该了解如何在命令行中进入特定的位置。为了做到这一点,你需要理解 Linux 文件系统中的路径是如何工作的。

Linux 中的绝对路径和相对路径有什么不同

接下来,这个教程系列会给你介绍目录导航和文件操作的基本知识。

终端基础:Linux 终端入门

1、编写你的第一个 Bash Shell 脚本

创建一个名为 hello.sh 的新文件:

nano hello.sh

这将在终端中打开 nano 编辑器。在其中输入以下几行代码:

#!/bin/bash
echo "Hello World"

通过按 Ctrl+X 键可以保存并退出 nano 编辑器。

现在,你可以以以下方式运行 Bash Shell 脚本:

bash hello.sh

你应该可以看到以下的输出:

Hello World

另一种方式是首先赋予脚本执行权限:

chmod u+x hello.sh

然后这样运行它:

./hello.sh
? 你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而,你需要切换到保存脚本的目录中才能运行它。

恭喜!你刚刚运行了你的第一个 Bash 脚本。

Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本

2、在 Bash 脚本中使用变量

变量的声明方式如下:

var=some_value

然后可以像这样访问变量:

$var
? 在声明变量时,等号(=)前后不能有空格。

我们通过添加一个变量来修改前面的脚本。

#!/bin/bash
message="Hello World"
echo $message

如果运行这个脚本,输出仍然会保持不变。

Hello World
Bash 基础知识系列 #2:在 Bash 中使用变量

3、向 Bash 脚本传递参数

你可以在运行 Bash 脚本时以以下方式传递参数:

./my_script.sh arg1 arg2

在脚本中,你可以使用 $1 来代表第 1 个参数,用 $2 来代表第 2 个参数,以此类推。$0 是一个特殊变量,它代表正在运行的脚本的名字。

现在,创建一个新的 shell 脚本,命名为 arguments.sh,并向其中添加以下几行代码:

#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

使其可执行并像这样运行它:

$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

让我们快速看一下特殊变量:

特殊变量描述
$0脚本名称
$1$2...$9脚本参数
${n}10 到 255 的脚本参数
$#参数数量
$@所有参数一起
$$当前 shell 的进程 id
$!最后执行命令的进程 id
$?最后执行命令的退出状态

你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。

为此,你必须使用 read 命令。你还可以使用 read -p 命令提示用户进行键盘输入,而不需要 echo 命令。

#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

现在,如果你运行这个脚本,当系统提示你输入“参数”时,你必须输入。

$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash
Bash 基础知识系列 #3:传递参数和接受用户输入

4、执行算术运算

在 Bash Shell 中执行算术运算的语法是这样的:

$((arithmetic_operation))

下面是你可以在 Bash 中执行的算术运算的列表:

操作符描述
+加法
-减法
*乘法
/整数除法(没有小数)
%模运算(只余)
**指数(a 的 b 次方)

以下是在 Bash 脚本中进行加法和减法的示例:

#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

你可以执行 Shell 脚本,使用你选择的任意数字作为参数。

如果你尝试除法,会出现一个大问题。Bash 只使用整数。默认情况下,它没有小数的概念。因此,你会得到 10/3 的结果为3,而不是 3.333。

对于浮点数运算,你需要这样使用 bc 命令:

#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

这个时候,你将看到准确的结果。

    The result is 8.33333333333333333333

Bash 基础知识系列 #4:算术运算

5、在 Bash 脚本中使用数组

你可以使用 Bash 中的数组来存储同一类别的值,而不是使用多个变量。

你可以像这样声明一个数组:

distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

要访问一个元素,使用:

${array_name[N]}

像大多数其他的编程语言一样,数组的索引从 0 开始。

你可以像这样显示数组的所有元素:

${array[*]}

这样获取数组长度:

${#array_name[@]}
Bash 基础知识系列 #5:在 Bash 中使用数组

6、Bash 中的基础字符串操作

Bash 能够执行许多字符串操作。

你可以使用这种方式获取字符串长度:

${#string}

连接两个字符串:

str3=$str1$str2

提供子字符串的起始位置和长度来提取子字符串:

${string:$pos:$len}

这里有一个例子:

你也可以替换给定字符串的一部分:

${string/substr1/substr2}

并且你也可以从给定字符串中删除一个子字符串:

    ${string/substring}

Bash 基础知识系列 #6:处理字符串操作

7、在 Bash 中使用条件语句

你可以通过使用 ifif-else 语句为你的 Bash 脚本添加条件逻辑。这些语句以 fi 结束。

单个 if 语句的语法是:

if [ condition ]; then
  your code
fi

注意使用 [ ... ];then

if-else 语句的语法是:

if [ expression ]; then
    ## execute this block if condition is true else go to next
elif [ expression ]; then
    ## execute this block if condition is true else go to next
else
    ## if none of the above conditions are true, execute this block
fi

这里有一个使用 if-else 语句的 Bash 脚本示例:

#!/bin/bash

read -p "Enter the number: " num
mod=$(($num%2))

if [ $mod -eq 0 ]; then
    echo "Number $num is even"
else
    echo "Number $num is odd"
fi

运行它,你应该能看到这样的结果:

-eq 被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较:

这些是你可以用来进行数值比较的测试条件操作符:

条件当...时,等同于 true
$a -lt $b$a < $b$a 是小于 $b
$a -gt $b$a > $b$a 是大于 $b
$a -le $b$a <= $b$a 是小于或等于 $b
$a -ge $b$a >= $b$a 是大于或等于 $b
$a -eq $b$a == $b$a 等于 $b
$a -ne $b$a != $b$a 不等于 $b

如果你在进行字符串比较,你可以使用以下这些测试条件:

条件当...时,等同于 true
"$a" = "$b"$a 等同于 $b
"$a" == "$b"$a 等同于 $b
"$a" != "$b"$a 不同于 $b
-z "$a"$a 是空的

还有些条件用于检查文件类型:

条件当...时,等同于 true
-f $a$a 是一个文件
-d $a$a 是一个目录
-L $a$a 是一个链接
? 要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地,条件操作符(-le== 等)之前和之后必须有空格。
Bash 基础知识系列 #7:If-Else 语句

8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环:forwhileuntil

这是 for 循环的一个例子:

#!/bin/bash

for num in {1..10}; do
    echo $num
done

运行它,你将看到以下输出:

1
2
3
4
5
6
7
8
9
10

如果你选择使用上面的示例,可以使用 while 循环这样重写:

#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

同样,可以使用 until 循环来重写:

#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done
? while 循环和 until 循环非常相似。区别在于:while 循环在条件为真时运行,而 until 循环在条件为假时运行。
Bash 基础知识系列 #8:For、While 和 Until 循环

9、在 Bash 脚本中使用函数

Bash Shell 支持使用函数,这样你不必反复编写相同的代码片段。

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

function_name() {
  commands
}

这是一个使用带参数的函数的 Bash 脚本样例:

#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

如果你运行该脚本,你将看到以下输出:

Let's use the sum function
The sum of 1 and 5 is: 6
Bash 基础知识系列 #9:Bash 中的函数

接下来呢?

这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多,你可以慢慢地、逐渐地探索。

GNU Bash 参考是一份优秀的在线资源,可以解答你的 Bash 疑问。

GNU Bash 参考

除此之外,你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容:

下载 Bash 初学者指南

一旦你具有足够的 Bash 基础知识,你可以通过这本免费书籍来学习高级 Bash 脚本:

下载高级 Bash 编程指南

这两本书至少都有十年的历史,但你仍然可以使用它们来学习 Bash。

? 希望你喜欢这个作为学习 Bash 脚本起点的教程。请在评论区提供你的反馈。

(题图:MJ/98f47121-7426-4297-9242-8683ccf0496d)


via: https://itsfoss.com/bash-scripting-tutorial/

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

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

UbuntuDDE Remix 23.04 带着最新的深度桌面环境登场。

我们在 去年 介绍过 UbuntuDDE Remix,当时他们发布了一个新的 LTS 版本。现在,大约一年后,我们有了一款新的 非 LTS 发行版,名为 UbuntuDDE Remix 23.04它基于最近发布的 Ubuntu 23.04

如果你还不知道,Ubuntu DDE Remix 是一个上面运行 深度 桌面环境(DDE)的 Ubuntu 发行版,旨在提供独特的用户体验。

对于那些因为其缓慢的服务器和其源于中国而产生的其他担忧,从而不喜欢深度操作系统(但喜欢他们的桌面体验)的用户来说,UbuntuDDE 是一个不错的替代品。

让我们来看看他们在这个版本中提供了什么。

? UbuntuDDE Remix 23.04:都有些什么新东西?

除了配备了 Linux 内核 6.2,这个版本的 UbuntuDDE Remix 提供了一些不错的改进。

这个版本最明显的亮点包括:

  • 深度桌面 23
  • 更新的软件套件
  • 新的壁纸

最新的深度桌面环境

UbuntuDDE Remix 23.04 采用了最新的深度操作系统 23 的桌面环境(2023 年 5 月更新),使其能够利用所有对用户界面、控制中心、设置以及你可能预期的即将发布的 深度操作系统发行版 23 的改进。

如果你有兴趣,UbuntuDDE 与上游和 深度桌面环境 的贡献者合作,使你能够完全领略改该桌面。

更新的软件套件

然后是更新的软件套件,它 具有之前安装的,基于 DDE 的原生应用程序的升级版本,例如:

  • 深度音乐
  • 深度影院
  • 深度计算器
  • 深度日志查看器
  • 深度文本编辑器
  • 等等

新的壁纸

最后,我们得到了来自 UbuntuDDE Remix 团队和深度操作系统的 新壁纸和素材。这些壁纸看起来非常不错,尤其是在使用浅色显示模式时。

开发者在 官方公告 博客中也提到,将在不久的将来通过 OTA 更新 推送更多的软件更新,进一步增强了整体的包装。

? 下载 UbuntuDDE Remix 23.04

你可以去 官方网站 下载 UbuntuDDE Remix 23.04。你可以从 官方仓库SourceForge 镜像,或以 种子下载方式 获取。

UbuntuDDE Remix 23.04

via: https://news.itsfoss.com/ubuntudde-remix-23-04-release/

作者:Sourav Rudra 选题:lujun9972 译者:ChatGPT 校对:wxy

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

韩国 SK 电信称 5G 未能兑现承诺

韩国最大的移动电信公司 SK 电信在最近一份题为《5G 经验教训、6G 关键要求、6G 网络演进和 6G 频谱》的白皮书中说,5G 被过度炒作,交付不足,未能提供杀手级应用。白皮书中说,5G 被当作自动驾驶、无人机、扩展现实和数字孪生的推动者,但由于种种原因,这些应用并未取得成功。该白皮书认为 5G 网络的性能并不是问题所在。虽然如此,5G 还是取得了一些成功,与 LTE 相比,每千兆字节的数据成本降低了 70%,使用 5G 的客户比使用 4G 的客户多使用了 50% 的数据。白皮书认为,预计将于 2030 年推出的 6G 可以避免 5G 所犯的错误。

消息来源:The Register
老王点评:事实就是,5G 并没有带来什么立竿见影的变化,很多人还觉得 5G 缩水了。

最新的安卓运行时使安卓应用启动速度提高了 30%

安卓运行时(ART)负责在安卓系统上实际运行应用程序,Java 和 Kotlin 编写的应用都会编译为由 ART 执行的字节码。ART 自安卓 12 以来一直在更新以提升性能。谷歌表示,最新的 ART 13 可以让安卓应用的启动速度 “在某些设备上提高多达 30%”。此外,将在未来几个月内推出的 ART 14,其新的编译器和运行时优化功能不但又进一步提高了性能,同时减少了代码大小。

消息来源:9to5google
老王点评:毋庸置疑,安卓的技术在不断进步,而目前,除了 iOS 之外,所有其它的移动操作系统均无法与之匹敌。

Chrome 会警告用户安装的恶意扩展

在 Chrome 浏览器网络商店中,有源源不断的不受欢迎的浏览器扩展发布,这些扩展程序会注入广告、跟踪你的搜索历史、将你重定向到联盟网页,或者在更严重的情况下窃取你的 Gmail 电子邮件和 Facebook 账户。当这些扩展程序被谷歌从 Chrome 网上商城删除,通常表明它们要么是开发者未发布的,要么是违反了相关政策或被检测为恶意软件。但这些被谷歌删除的扩展,不会在已经安装了它们的用户的浏览器上自动删除。谷歌宣布,在最新的 Chrome 117 中,它会发出警告通知用户,提醒他们从浏览器中卸载这些扩展程序。

消息来源:Bleeping Computer
老王点评:这确实是一种好的机制,唯一不好的只是推出的太晚了。

在 Linux 和 Windows 之间安全共享文件的无缝方式? 试试这个!

在我们撰写《First Look》系列文章的过程中,我们找到了一种在 Linux 和 Windows 系统之间传输文件的安全且高效的方法。

一个名为 “Warp” 的工具,它是 GNOME Circle 的一部分,其中包含扩展 GNOME 生态系统的应用。Warp 有助于通过互联网或本地网络无缝传输文件。

我们来看一下。

Warp:概述 ⭐

Warp 主要用 Rust 编程语言 编写,是一个基于 GTK 的文件传输应用,它使用 “Magic Wormhole” 协议使通过互联网/本地网络的文件传输成为可能。

所有文件传输均经过加密,接收者必须 使用基于单词的传输码来访问文件,以防止任何滥用。

请允许我向你展示它是如何工作的。

当你第一次启动该应用时,你会看到欢迎屏幕和关于 Warp 的简短介绍。

继续后,你将进入 “ 发送 Send ” 菜单,你可以在其中选择要发送的文件或文件夹。

? 你还可以将文件和文件夹拖放到应用中。

之后,屏幕上将显示文本和二维码形式的传输码。你必须将其安全地发送给接收者,他们才能开始下载文件。

? 由于 Warp 是一个跨平台应用,你可以在 Linux 和 Windows 系统之间发送文件。

那么,接收方看起来怎么样?

好吧,他们必须进入 “ 接收 Receive ” 菜单并将传输码粘贴到文本框中。他们还可以扫描二维码,将准确的文本复制到他们的设备上。

粘贴代码并单击 “ 接收文件 Receive File ” 后,Warp 将开始连接到发送者的设备。

如果成功,将会显示 “ 已连接到对等点 Connected to Peer ” 状态。如果不是,则表明发送者或接收者的系统/网络出现问题。

连接成功后,接收者可以选择 “ 接受 Accept ” 将其保存到系统的“ 下载 Downlaods ” 文件夹中,也可以选择 “ 另存为 Save As ” 将其保存在他们选择的位置。

就是这样。文件传输完成后,接收方将显示以下页面:

用户还可以进入菜单图标下的 “ 首选项 Preferences ” 菜单来访问高级设置,例如设置 “ 集合点/中转服务器 URL Rendezvous/Transit Server URL ” 或将 “ 传输码字数 Code Word Count ” 设置为更长的字数来增强安全性。

这就是 Warp 的全部内容。它简单且工作良好

? 获取 Warp

Warp 可用于 LinuxWindows。你可以获取你选择的软件包或查看其 GitLab 页面上的源代码。

对于 Linux 用户,你可以从 Flathub 获取它。

Warp (Flathub)

via: https://news.itsfoss.com/warp-file-sharing/

作者:Sourav Rudra 选题:lujun9972 译者:geekpi 校对:校对者ID

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

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

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

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

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

Bash 中的函数

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

function_name() {
    commands
}

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

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

function_name() {
    commands
}

some_other_commands

# 函数调用
function_name argument;
? 函数定义必须在你调用函数之前。

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

#!/bin/bash

fun() {
    echo "This is a function"
}

echo "This is a script"
fun

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

This is a script
This is a function

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

向函数传递参数

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

function_name argument;

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

#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

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

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

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

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

#!/bin/bash

arg() {
    echo "1st argument to function is $1 and 2nd is $2"
}

echo "1st argument to script is $1 and 2nd is $2"
arg $2 $1

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

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

Bash 中的递归函数

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

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

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

n 的阶乘:

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

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

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

#!/bin/bash

factorial() {

    if [ $1 -gt 1 ]; then
        echo $(( $1 * $(factorial $(( $1 -1 ))) ))
    else
        echo 1
    fi

}

echo -n "Factorial of $1 is: "
factorial $1

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

$ ./factorial.sh 5
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 手册

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

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


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

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

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