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

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日

相关推荐

  • 这就是为什么大多数人还没有进入人工智能的原因

    人工智能是一个加载的术语。对一些人来说,它象征着未来的道路;对其他人来说,这是一种颠覆性的技术,可以让他们摆脱工作。尽管仍处于早期阶段,但大型科技公司正在对聊天机器人和虚拟助手等支…

    工具软件 2024年6月16日
  • Microsoft 将允许您通过 GUI 管理 Windows 11 上的 Linux 发行版

    Microsoft 添加了适用于 Linux 的 Windows 子系统 (WSL),让任何人都可以直接运行 Linux 发行版。多亏了 WSA,您不需要双启动 Linux 或创建…

    2024年3月26日
  • 如何在 Ubuntu 上安装和使用 Chrome Headless?

    在 Ubuntu Linux 上安装和使用 Google Chrome Headless 这里给出的安装 Google Chrome 并将其用作 Ubuntu 上的无头浏览器的步骤…

    2024年3月17日
  • AI-Waifu-Vtuber AI伴侣虚拟YouTuber

    该项目受到shioridotdev的启发,利用VoiceVox Engine、DeepL、Whisper OpenAI、Seliro TTS和VtubeStudio等多种技术来创建…

    工具软件 2023年11月23日
  • iOS 17 Bug 孩子绕过「使用时间」限制

    不少家长也会为子女的 iPhone/iPad 加入 「屏幕使用时间」功能,例如限制他们每天不能玩游戏超过一定时间。 有家长发现,iOS 17 推出后,这个设定有时可能会「失效」! …

    2023年10月21日
  • Windows 11如何下载和安装 Linux

    Linux 是一个操作系统,类似于 Windows,但由于开源和完全可定制的性质,具有许多不同的版本。要安装 Linux,您必须选择安装方法并选择 Linux 发行版。 要安装 L…

    2023年10月19日 微软Microsoft
  • 如何检查 Linux 上安装的 Java 版本

    在您的 Linux 系统上拥有正确的 Java 版本对于开发人员和普通用户都至关重要。但是,如何检查您的 Linux 机器上当前安装了哪个 Java 版本呢?在本综合指南中,我们将…

    Linux命令 2023年10月17日
  • 如何在 Linux 上使用 tee 命令

    Linux 是多功能且功能强大的操作系统,提供了大量命令和实用程序,可以使您作为系统管理员或开发人员的生活更轻松。其中,tee 命令是一个简单但非常有用的工具,用于操作和重定向数据…

    Linux命令 2023年10月17日
  • 如何在 Linux 上更改 TTL

    在不断发展的 Linux 网络环境中,掌握 TTL(生存时间)操作的艺术对于任何网络管理员或爱好者来说都是一项至关重要的技能。TTL代表“生存时间”,是数据包传输领域的基本要素。在…

    Linux命令 2023年10月14日
  • 如何在 Linux 上使用自由命令

    功能强大的工具提供了对系统内存使用情况的宝贵见解,并且可以成为维护 Linux 服务器或个人机器性能的关键资产。无论您是经验丰富的 Linux 管理员还是新手用户,本指南都将引导您…

    Linux命令 2023年10月4日
  • 如何使用 Linux 时间命令

    这是一个用于跟踪和优化系统性能的强大工具。无论您是经验丰富的 Linux 用户还是在开源领域导航的新手,了解 Time Command 将提高您的熟练程度并帮助您释放 Linux …

    Linux命令 2023年10月1日
  • 如何在 Linux 上删除节点模块

    Node.js的标志之一是通过Node模块的依赖管理系统。这些模块对于构建健壮的应用程序至关重要,但随着项目的发展,有效管理这些模块的需求也在增加。在本综合指南中,我们将探讨使用命…

    Linux命令 2023年9月26日
  • 如何启动iPhone 15 Pro ProRes 4K 60 fps 摄录功能?

    iPhone 15 Pro Max 终于可以拍摄 4K60fps 的 ProRes 影片,这个非常耗用资源的功能,是否可以随时使用? 有没有使用限制? iPhone 15 Pro系…

    2023年9月26日
  • 如何在 Linux 上检查 CPU 使用率

    无论您是运行 Web 服务器、管理数据库,还是只是确保系统的平稳运行,了解如何有效地监控 CPU 使用情况都是必不可少的技能。在本综合指南中,我们将深入研究各种 Linux 实用程…

    Linux命令 2023年9月20日
  • 如何在 Linux 上安装和使用 exa 命令

    凭借其增强的文件列表功能和自定义选项,exa 是各种专业知识的 Linux 用户的宝贵工具。本指南将引导您完成在 Linux 系统上安装 exa 的过程,并帮助您充分利用其潜力。l…

    Linux命令 2023年9月19日
  • 如何在 Linux 上获取当前日期和时间

    Linux 命令行提供了大量的工具和实用程序,可以毫不费力地获取当前日期和时间。本综合指南将引导您完成各种方法,提供详细的分步说明、故障排除提示和其他资源,以全面了解 Linux …

    Linux命令 2023年9月18日
  • 如何使用 UFW 在 Linux 上阻止和取消阻止 IP 地址

    确保 Linux 系统的安全至关重要,安全性的基本方面之一是有效地管理传入和传出的网络流量。本综合指南将深入探讨 Linux 防火墙管理的世界,特别关注如何通过命令行使用 UFW(…

    Linux命令 2023年9月17日
  • 如何在 Linux 上使用 stat命令

    命令就是这样一种工具,这是一个多功能实用程序,旨在深入了解文件和目录。在本指南中,我们将深入到命令的世界,探索其各种功能、实际应用和实际示例。无论您是经验丰富的 Linux 专业人…

    Linux命令 2023年9月15日
  • 如何在 Linux 上使用哪个命令

    在您可以使用的命令库中,不起眼的“”命令是一个坚定的指南,可帮助您巧妙而精确地定位可执行文件。无论您是经验丰富的 Linux 用户还是好奇的新手,掌握 ” 命令都将使您…

    Linux命令 2023年9月12日
  • 如何在Linux上修复“执行格式错误”

    Linux操作系统以其健壮性和灵活性而闻名,但即使是最有经验的用户也可能会遇到可怕的“exec格式错误”。这种令人困惑的错误可能是一个障碍,阻止执行重要的命令和应用程序。 了解“执…

    Linux命令 2023年9月10日
  • 如何使用Windows GUI查找WSL主目录?

    WSL(适用于Linux的Windows子系统)是一个专门创建的软件层,由Microsoft在Windows 11或10上本地运行Linux二进制可执行文件。在 WSL 上安装 L…

    2023年9月8日
  • 如何在 Linux 上使用 Dos2unix 命令

    一个经常被忽视的可能对跨平台文件共享造成严重破坏的因素是DOS和Unix系统之间的文本文件格式差异。输入命令 – 一个强大的工具,可以弥合这一差距并确保您的文件保持完整…

    Linux命令 2023年9月6日
  • 如何在 Linux 上使用 Traceroute Command

    实现无缝连接和快速解决问题对于最佳性能至关重要。输入“跟踪路由”命令 – 一种网络检测工具,可显示跨网络进行的旅程数据包。本指南深入探讨了 Linux 上 tracer…

    2023年9月4日
  • 如何在Linux上修复“找不到sudo命令”

    遇到可怕的“找不到sudo命令”错误可能是一种令人困惑和沮丧的体验。不要害怕,因为本综合指南旨在逐步引导您完成故障排除过程,帮助您重新获得对 Linux 系统管理功能的控制。 了解…

    2023年9月1日
  • Google Bard 开放支持中文!三大AI聊天机器人,哪个最受用户欢迎?

    技巨头Google 推出的大型语言模型(LLM) 聊天机器人Bard,和ChatGPT 一样可以生成文本、翻译语言、编写不同类型的创意内容(例如诗歌、程式码、脚本、音乐作品、电子信…

    最新资讯 2023年7月18日