学习=~操作符在bash脚本中的工作和功能

320 阅读4分钟

Bash程序是一个简单的文本文件,里面有一系列的指令。这些语句结合了我们手动放在命令提示符上的指令(包括这样的ls或cp)。同样,你能用脚本完成的事情也可以用命令提示符来完成。正则表达式匹配符号,即=~操作符,用于识别正则表达式。Perl也有一个类似的操作符来对应正则表达式,这就刺激了这个操作符。让我们举几个例子来看看Ubuntu 20.04中=~运算符的工作情况。

例子1:

首先,我们需要从我们的系统中登录。然后,在桌面上,按 "Ctrl+Alt+T "打开Ubuntu 20.04的控制台终端。作为一个替代方法,我们也可以使用桌面左上角的菜单 "活动"。点击 "活动",就会弹出搜索栏。点击它并写上 "终端"。终端应用程序将被弹出。点击它来打开它。现在,终端已经通过使用上述两种方法中的一种打开了,如图所示。让我们看看=~运算符在其中是如何工作的。首先,为了写一个bash脚本,我们需要创建一些bash文件。因此,我们用控制台典型的 "touch "查询方式创建了一个文件 "new.sh",如下所示。

$ touch new.sh

你可以在Ubuntu 20.04的主文件夹中找到创建的bash文件。由于该文件已经创建,我们将在其中添加一些bash脚本。为此,我们必须用一些编辑器在终端打开这个文件。因此,我们利用GNU Nano编辑器来做这件事,如下所示。

$ nano new.sh

现在文件已经在GNU编辑器中打开了,我们必须在其中加入下面的bash代码。你可以看到我们已经在其中加入了bash扩展名。之后,我们用一些包含数字和字母的字符串类型的值初始化了一个变量 "var"。我们加入了 "if "语句来检查条件是否满足。这个条件将检查变量 "var "是否包含条件语句右侧提到的字符、符号和字母。如果该模式包含一些字母和符号,它将通过echo语句在终端显示 "匹配";否则,打印 "不匹配"。

通过Ctrl+S保存bash脚本,并通过Ctrl+X@退出。让我们通过bash查询执行bash文件 "new.sh",如下所示。输出结果显示为 "匹配",因为变量模式与定义的字符和字母集相匹配。

$ bash new.sh

例子2:

这次我们来举一个更简单的例子。打开同样的 "new.sh "文件来更新其内容。所以,再次在shell中使用下面的指令。

$ nano new.sh

在GNU编辑器中打开它之后,让我们用下面的bash脚本来更新它。Bash从第3版(大约2004年)开始就有了构造模式匹配比较运算符,符号是=~。许多以前需要全部使用grep或sed的脚本技术都可以用bash语句来管理,而且bash短语甚至可以使你的脚本更容易理解和管理。当参数如$var = "[[0-9]]"表明左边的字段满足右边的短语时,Bash会返回一个0,或者在其他地方返回一个1,就像其他对比运算符(如-lt或==)一样。由于我们给变量 "var "设定了值 "6",它满足了条件,因此返回0,那么它将打印出 "6是一个数字 "的信息。如果条件出错,它将打印 "不是数字"。我们通过 "Ctrl+S "保存文件,并通过 "Ctrl+X "快捷键将其返回到终端。

一旦我们在终端上再次执行该文件,它就会通过以下查询显示 "6是一个数字"。

$ bash new.sh

它显示 "6是一个数字 "的信息是因为变量 "var "满足了 "if "语句中的条件。让我们再一次更新我们的变量来看看输出。通过以下方式再次打开bash文件。

$ nano new.sh

在编辑器中打开该文件后,我们已经更新了该变量并给它分配了一个字符串类型的值 "G"。这一次,条件不应该被满足,必须在终端输出第二个echo语句 "不是一个数字"。保存并关闭bash脚本文件。

在执行bash文件时,我们已经发现了预期的结果。你可以看一下,在 "if "语句的条件下,显示了 "不是一个数字 "的信息。我们在控制台中使用所述的查询来查看输出。

$ bash new.sh

例子3:

让我们来看看一个非常简单但又有点不同的例子。再次打开bash文件 "new.sh"。

$ nano new.sh

当你不确定 "正则表达式 "到底是什么意思时,这里有一个简单的描述。一个序列由正则表达式表示,它是一系列的字母。首先,我们向用户显示了一条信息 "输入任何东西",然后读取用户通过终端输入的信息。然后,我们用if语句来检查用户输入的值是否与提到的模式相符。在下面的插图中,[0-9]符合单个数字,但[A-Z]符合某个大写字母。[A-Z]+将适合任何大写字母组合。短语[A-Z]+$,但在另一边,可以满足一个完全由大写字母组成的字符串。

执行时,用户输入了,9,它打印出 "9是一个数字"。

再次执行时,用户输入了#。它显示:"#不是数字"。

当用户输入 "K "时,它显示 "K不是数字"。

例子4:

让我们举一个复杂的例子来阐述=~运算符。再一次打开该文件。

$ nano new.sh

Bash中的Regex可能有点棘手。我们正在检查下面整个样本中$email字段的内容是否像一个电子邮件地址的内容。确实值得注意的是,第一个短语(账户名)可以包括字母、数字和特殊符号。@符号出现在名字和电子邮件网站之间,还有一个字面的点(.)出现在主网域和 "com"、"net"、"gov "等之间。双括号用于包围对比。

第一次执行时,用户输入了正确的电子邮件模式。输出显示电子邮件,并有 "电子邮件是正确的 "的成功信息。

在另一次执行时,用户输入了错误的电子邮件模式。因此,电子邮件的输出显示失败信息 "电子邮件似乎不正确"。

总结

在本指南中,我们已经看到了=~操作符在bash脚本中的工作和功能,以及它在bash中的含义。我们希望本指南能给你带来最好的帮助,而且你在接受它的帮助时没有发现任何问题。