如何在 Linux 中使用双括号条件测试

天猫U特购  京东优惠购        京东优惠    天猫优惠
shutterstock_1278851809

条件测试根据逻辑表达式的结果对Linux Bash脚本的执行流程进行分支。双括号条件测试大大简化了语法——但仍然有自己的问题。

单双括号

Bash 提供了test命令。这使您可以测试逻辑表达式。该表达式将返回一个表示真或假响应的答案。返回值为零表示真实响应。零以外的任何值都表示错误。

&&操作员在命令行上链接命令使用此功能。仅当前一个命令成功完成时,才会执行命令。

如果测试为真,将打印“是”字样。

test 15 -eq 15 && echo "Yes"
test 14 -eq 15 && echo "Yes"

1-3

单括号条件测试模仿test命令。它们将表达式括在方括号“ [ ]”中并像test命令一样操作。事实上,它们是相同的程序,由相同的源代码创建。唯一的操作区别是test版本和[版本如何处理帮助请求。

这是来自源代码

/* Recognize --help or --version, but only when invoked in the
"[" form, when the last argument is not "]". Use direct
parsing, rather than parse_long_options, to avoid accepting
abbreviations. POSIX allows "[ --help" and "[ --version" to
have the usual GNU behavior, but it requires "test --help"
and "test --version" to exit silently with status 0. */

我们可以通过询问看到这样的效果test,并[帮助和检查送往猛砸响应代码。

test --help
echo $?
[ --help
echo $?

3-3

双方test[都外壳内建命令,意味着它们是置于猛砸。但也有一个独立的二进制版本的[.

type test
type [
whereis [

2-4

相比之下,双括号条件测试[[]]关键字[[]]执行逻辑测试,但它们的语法不同。因为它们是关键字,所以您可以使用一些在单括号版本中无法使用的简洁功能。

Bash 支持双括号关键字,但并非在所有其他 shell中都可用例如,Korn shell 确实支持它们,但普通的旧 shell sh 不支持。我们所有的脚本都以以下行开头:

#!/bin/bash

这确保我们调用 Bash shell 来运行脚本

内置函数和关键字

我们可以使用该compgen程序列出内置函数:

compgen -b | fmt -w 70

如果不通过管道输出输出,fmt我们会得到一个很长的列表,每个内置函数都在自己的行上。在这种情况下,将内置函数组合成一个段落会更方便。

4-3

我们可以看到test[在列表中,但]没有列出。该[命令查找关闭]以检测何时到达表达式的末尾,但]不是单独的内置命令。这只是我们提供的一个信号,[用于指示参数列表的结尾。

要查看关键字,我们可以使用:

compgen -k | fmt -w 70

5-3

[[]]列表中的关键字都是,因为[[是一个关键字,]]是另一回事。它们是配对的,就像ifandficaseand 一样esac

当 Bash 解析脚本或命令行并检测到具有匹配的关闭关键字的关键字时,它会收集它们之间出现的所有内容,并应用关键字支持的任何特殊处理。

使用内置命令,内建命令后面的内容就像传递给任何其他命令行程序的参数一样传递给它。这意味着脚本作者必须特别注意变量值中的空格等内容。

壳流

双括号条件测试可以使用 shell globbing。这意味着星号“ *”将扩展为“任何东西”。

将以下文本键入或复制到编辑器中,并将其保存到名为“whelkie.sh”的文件中。

#!/bin/bash

stringvar="Whelkie Brookes"

if [[ "$stringvar" == *elk* ]];
then
  echo "Warning contains seafood"
else
  echo "Free from molluscs"
fi

为了使脚本可执行,我们需要使用带有 (execute) 选项的chmod命令-x。如果您想试用本文中的所有脚本,则需要对它们执行此操作。

chmod +x whelkie.sh

16-1

当我们运行脚本时,我们看到在字符串“Whelkie”中找到了字符串“elk”,不管它周围有什么其他字符。

./whelkie.sh

6-2

需要注意的一点是,我们不将搜索字符串用双引号括起来。如果您这样做,则不会发生通配符。搜索字符串将按字面处理。

允许使用其他形式的 shell globbing。问号“ ?”将匹配单个字符,单个方括号用于表示字符范围。例如,如果您不知道使用哪种情况,您可以用一个范围覆盖这两种可能性。

#!/bin/bash

stringvar="Jean-Claude van Clam"

if [[ "$stringvar" == *[cC]lam* ]];
then
  echo "Warning contains seafood."
else
  echo "Free from molluscs."
fi

将此脚本另存为“damme.sh”并使其可执行。当我们运行它时,条件语句解析为真,并且执行 if 语句的第一个子句。

./damme.sh

7-3

引用字符串

我们之前提到过用双引号包裹字符串。如果这样做,就不会发生 shell globbing。尽管约定俗成说这是一种很好的做法,但在使用时不需要将字符串变量用引号括起来[[]]即使它们包含空格。看下一个例子。the$stringvar$surnamestring变量都包含空格,但条件语句中都没有引用。

#!/bin/bash

stringvar="van Damme"
surname="van Damme"

if [[ $stringvar == $surname ]];
then
echo "Surnames match."
else
echo "Surnames don't match."
fi

将其保存到名为“surname.sh”的文件中并使其可执行。使用以下命令运行它:

./surname.sh

8-2

尽管两个字符串都包含空格,脚本还是会成功并且条件语句解析为 true。这在处理包含空格的路径和目录名称时很有用。在这里,-d如果变量包含有效的目录名称,则该选项返回 true。

#!/bin/bash

dir="/home/dave/Documents/Needs Work"

if [[ -d ${dir} ]];
then
  echo "Directory confirmed"
else
  echo "Directory not found"
fi

如果您更改脚本中的路径以反映您自己计算机上的目录,将文本保存到名为“dir.sh”的文件中并使其可执行,您可以看到这是有效的。

./dir.sh

9-2

文件名通配问题

之间的有趣的差异[ ][[ ]]涉及到的文件名与他们通配符。格式“*.sh”将匹配所有脚本文件。[ ] 除非只有一个脚本文件,否则使用单括号会失败。查找多个脚本会引发错误。

这是带有单括号条件的脚本。

#!/bin/bash

if [ -a *.sh ];
then
  echo "Found a script file"
else
  echo "Didn't find a script file"
fi

我们将此文本保存到“script.sh”中并使其可执行。我们检查了目录中有多少脚本,然后运行脚本。

ls
./script.sh

10-2

Bash 抛出错误。我们删除了除一个脚本文件之外的所有文件并再次运行该脚本。

ls
./script.sh

11-2

条件测试返回 true 并且脚本不会导致错误。编辑脚本以使用双括号提供了第三种行为。

#!/bin/bash

if [[ -a *.sh ]];
then
  echo "Found a script file"
else
  echo "Didn't find a script file"
fi

我们将其保存到一个名为“dscript.sh”的文件中并使其可执行。在包含许多脚本的目录中运行此脚本不会引发错误,但该脚本无法识别任何脚本文件。

使用双括号的条件语句仅在不太可能的情况下解析为 true,即您在目录中有一个实际名为“*.sh”的文件。

./dscript.sh

12-1

逻辑与和或

双括号让您可以使用&&and||作为逻辑 AND 和 OR 运算符。

此脚本应将条件语句解析为 true,因为 10 等于 10,25 小于 26。

#!/bin/bash

first=10
second=25

if [[ first -eq 10 && second -lt 26 ]];
then
  echo "Condition met"
else
  echo "Condition failed"
fi

将此文本保存到名为“and.sh”的文件中,使其可执行,然后运行:

./and.sh

13-2

脚本按我们的预期执行。

这次我们将使用||运算符。条件语句应该解析为真,因为尽管 10 不大于 15,但 25 仍然小于 26。只要第一次比较第二次比较为真,整个条件语句就会解析为真。

将此文本另存为“or.sh”并使其可执行。

#!/bin/bash

first=10
second=25

if [[ first -gt 15 || second -lt 26 ]];
then
  echo "Condition met."
else
  echo "Condition failed."
fi
./or.sh

14-2

正则表达式

双括号条件语句允许使用=~运算符,它将字符串中的正则表达式搜索模式应用于语句的另一半。如果满足正则表达式,则认为条件语句为真。如果正则表达式没有找到匹配项,则条件语句将解析为 false。

将此文本保存到名为“regex.sh”的文件中,并使其可执行。

#!/bin/bash

words="one two three"
WordsandNumbers="one 1 two 2 three 3"
email="dave@fabricateddomain.co.uk"

mask1="[0-9]"
mask2="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}"

if [[ $words =~ $mask1 ]];
then
  echo "\"$words\" contains digits."
else
  echo "No digits found in \"$words\"."
fi

if [[ $WordsandNumbers =~ $mask1 ]];
then
  echo "\"$WordsandNumbers\" contains digits."
else
  echo "No digits found in \"$WordsandNumbers\"."
fi

if [[ $email =~ $mask2 ]];
then
  echo "\"$email\" is a valid e-mail address."
else
  echo "Couldn't parse \"$email\"."
fi

第一组双括号使用字符串变量$mask1作为正则表达式。这包含 0 到 9 范围内所有数字的模式。它将此正则表达式应用于$words字符串变量。

第二组双括号再次使用字符串变量$mask1作为正则表达式,但这次它与$WordsandNumbers字符串变量一起使用。

最后一组双括号在字符串变量中使用了更复杂的正则表达式掩码$mask2

  • [A-Za-z0-9._%+-]+:这匹配任何大写或小写字母,或从零到九的任何数字,或句点、下划线、百分号或加号或减号的任何字符. “ +” 之外的“ []” 表示对找到的尽可能多的字符重复这些匹配项。
  • @:这仅匹配“@”字符。
  • [A-Za-z0-9.-]+:这匹配任何大写或小写字母,或从零到九的任何数字,或句点或连字符的任何字符。“ +” 之外的“ [ ]” 表示对找到的尽可能多的字符重复这些匹配项。
  • :这匹配“。” 仅字符。
  • [A-Za-z]{2,4}:这匹配任何大写或小写字母。“ {2,4}”表示至少匹配两个字符,最多匹配四个字符。

综上所述,正则表达式掩码将检查电子邮件地址的格式是否正确。

将脚本文本保存到名为“regex.sh”的文件中并使其可执行。当我们运行脚本时,我们得到了这个输出。

./regex.sh

15-1

第一个条件语句失败,因为正则表达式正在寻找数字,但$words字符串变量中保存的值中没有数字。

第二个条件语句成功,因为$WordsandNumbers字符串变量确实包含数字。

最后一个条件语句成功——也就是说,它解析为真——因为电子邮件地址的格式正确。

只有一个条件

双括号条件测试为您的脚本带来了灵活性和易读性。能够在条件测试中使用正则表达式证明学习如何使用[[]].

只需确保脚本调用支持它们的 shell,例如 Bash。

原创文章,作者:校长,如若转载,请注明出处:https://www.yundongfang.com/Yun224096.html

(0)
打赏 微信扫一扫不于多少! 微信扫一扫不于多少! 支付宝扫一扫礼轻情意重 支付宝扫一扫礼轻情意重
上一篇 2021年12月19日
下一篇 2021年12月21日

相关推荐

  • 如何在 AlmaLinux 8 上安装 Cyber​​Panel

    Cyber​​Panel 是一个免费和开源的网络托管控制面板,它带有一个OpenLiteSpeed Web 服务器,以提供最好的可能表现。使用 Cyber​​Panel,您可以管理…

    2022年5月12日 Linux命令
    222
  • 如何在 AlmaLinux 8 上安装 FileRun

    FileRun 是一个免费的、开源的、自托管的文件共享和同步应用程序,用 PHP 编写。通过用户友好的 Web 界面,您可以存储和管理文件、照片、电影等 在 AlmaLinux 8…

    Linux命令 2022年4月28日
    245
  • 如何在 AlmaLinux 8 上安装 Laravel

    Laravel 是一个 PHP Web 应用程序框架,具有富有表现力、优雅的语法。它具有精炼、简单和可读的语法,用于从头开始开发现代、健壮和强大的应用程序。Laravel 提供了强…

    Linux命令 2022年4月18日
    222
  • 如何在 AlmaLinux 8 上安装管理员

    Adminer(以前称为 phpMinAdmin)是一个开源和免费的基于 Web 的数据库管理工具。您可以将 Adminer 与 MySQL、MariaDB、PostgreSQL、…

    Linux命令 2022年4月18日
    284
  • 如何在 AlmaLinux 8 上安装 Ntopng

    Ntopng 是一个基于商用硬件的免费、开源软件网络监控解决方案。ntopng 和流量收集器的主要区别在于,ntopng 不仅报告流量统计信息,还分析流量,对观察到的流量类型得出结…

    Linux命令 2022年4月18日
    253
  • 如何在 AlmaLinux 8 上安装 Prometheus

    Prometheus 是一个开源监控,具有维度数据模型、灵活的查询语言、高效的时序数据库和现代警报方法。 在 AlmaLinux 8 上安装 Prometheus 第 1 步。首先…

    Linux命令 2022年4月12日
    252
  • 如何在 AlmaLinux 8 上安装 Terraform

    Terraform 是一个开源基础设施,作为代码软件工具,它使您能够安全且可预测地创建、更改和改善基础设施。Terraform 由 Hashicorp 构建并在 Mozilla P…

    Linux命令 2022年4月10日
    179
  • 如何在 AlmaLinux 8 上安装 Ruby on Rails

    Ruby on Rails 或 Rails 是一个用 Ruby 编程语言编写的开源 Web 应用程序开发框架。Rails 是一个服务器端 Web 应用程序框架,可促进 Web 标准…

    Linux命令 2022年4月7日
    193
  • 如何在 AlmaLinux 8 上安装 MediaWiki

    ,MediaWiki 是免费的开源软件,可帮助用户收集和组织信息。Mediawiki 帮助您收集和组织知识,并使您组织内外的其他人都可以访问它。它非常强大、多语言、可扩展、可调整、…

    2022年4月2日
    235
  • 如何在 AlmaLinux 8 上安装 OTRS

    OTRS 代表“Open Source Trouble Ticket System”,它是一个免费的开源服务管理套件。它是用 PERL 编程语言编写的,它与其他系统集成的能力使其更…

    Linux命令 2022年4月2日
    255
  • 如何在 AlmaLinux 8 上安装 Apache Guacamole

    Apache Guacamole 是一个基于 Web 的无客户端 HTML5 远程桌面网关,支持 VNC、RDP 和 SSH 等标准协议。它不需要任何第三方插件和客户端即可工作。您…

    Linux命令 2022年3月28日
    220
  • 如何在 AlmaLinux 8 上安装 Vivaldi 浏览器

    Vivaldi 是由 Vivaldi Technologies 开发的免费软件、跨平台 Web 浏览器。该浏览器是Chrome、Firefox、Opera 和其他流行浏览器的有趣替…

    Linux命令 2022年3月28日
    187
  • 如何在 AlmaLinux 8 上安装 Passbolt

    Passbolt 是一个基于 PHP、MySQL 和 OpenPGP 的免费开源密码管理器,可让您安全地存储并共享网站的登录凭据、路由器密码、Wi-Fi 密码等。它是自托管的,提供…

    Linux命令 2022年3月27日
    231
  • 如何在 AlmaLinux 8 上安装 GIMP

    GIMP(GNU Image Manipulation Program)免费和开源的图像编辑器以及 Adob​​e 的 Photoshop 替代品,并附带了许多图像和照片的专业编辑…

    Linux命令 2022年3月17日
    254
  • 如何在 AlmaLinux 8 上安装 AnyDesk

    AnyDesk 是一款旨在可靠且快速的远程桌面应用程序。它帮助我们轻松快速地在计算机之间建立连接以远程访问和共享屏幕。AnyDesk 适用于 Linux、FreeBSD、Raspb…

    Linux命令 2022年3月17日
    244
  • 如何在 AlmaLinux 8 上安装 VS Code-Server

    Visual Studio Code 是微软开发的开源跨平台代码编辑器。它具有内置调试支持、嵌入式 Git 控制、语法突出显示、代码完成、集成终端、代码重构和片段。Code-Ser…

    2022年3月13日
    263
  • 如何在 AlmaLinux 8 上安装 Varnish

    Varnish 缓存是一个开源的高性能 HTTP 加速器,旨在加速 Web 服务器。与其他专注于 FTP、SMTP 和其他网络协议的代理服务器相比,Varnish 专注于 HTTP…

    Linux命令 2022年3月11日
    198
  • 如何在 AlmaLinux 8 上安装 Drupal

    Drupal 是一个开源且流行的内容管理工具,拥有庞大的支持社区。全球数以百万计的人和组织使用它来构建和维护他们的网站。 在 AlmaLinux 8 上安装 Drupal 第 1 …

    2022年3月11日
    210
  • 如何在 AlmaLinux 8 上安装 Adoptium Temurin

    Eclipse Temurin 是一个专注于构建支持构建运行时二进制文件和相关技术的代码和流程的项目在整个 Java 生态系统中使用。 在 AlmaLinux 8 上安装 Adop…

    Linux命令 2022年3月11日
    294
  • 如何在 AlmaLinux 8 上安装 Atom 文本编辑器

    Atom 是一款免费、跨平台、开源的图形软件,专为程序员的编辑器而设计帮助开发人员轻松编写代码的应用程序。Atom 文本编辑器支持几乎所有的操作系​​统,例如 Linux、Wind…

    Linux命令 2022年3月11日
    186
  • 如何在 AlmaLinux 8 上安装 Flameshot

    Flameshot 是一个可用于 Linux、Mac 和 Windows 的开源截图工具。这个截图工具最好的一点是它可以同时使用图形用户界面和命令行界面。它是一个非常易于使用的截图…

    2022年3月5日
    211
  • 如何在 AlmaLinux 8 上安装 Arduino IDE

    Arduino 是免费的开源软件,用于将编程代码编写、上传和编译到 Arduino板。它由一个编辑器和一个编译器组成,可以实现更好的辅助编辑和编译。许多操作系统都支持 Arduin…

    2022年3月4日
    200
  • 如何在 AlmaLinux 8 上安装 Sublime Text

    Sublime Text 软件是众所周知的轻量级源代码编辑器。它提供了命令调色板、转到任何内容、自动完成、片段和插件等功能,并且适用于所有主要平台,包括 Linux、macOS 和…

    2022年3月4日
    199
  • 如何在 AlmaLinux 8 上安装 Teampass 密码管理器

    Teampass 是一个开源密码管理器,可帮助您从中央位置存储和管理所有密码. 它提供了大量功能,可让您以有组织的方式管理所有密码。您可以定义用户的访问权限,以允许他们仅访问给定的…

    2022年3月4日
    176
  • 如何在 AlmaLinux 8 上安装 GCC 编译器

    GNU Compiler Collection,通常称为 (GCC),是一个包含多个编译器和开发工具的软件包编程语言,例如 C、C++、Objective-C、Fortran、Ja…

    Linux命令 2022年3月4日
    273
天猫U特购  京东优惠购  如果还想领红包,可以在天猫APP那搜一下【小红包】每天可以领天猫红包,无门槛,可叠加使用。