Bash 中的 [ 和 [[ 有什么区别? [复制]

2024-03-24

我查看了 bash 手册页和[[说它使用条件表达式。然后我查看了条件表达式部分,它列出了与test (and [).

所以我想知道,有什么区别[ and [[在巴什?


[[bash 的改进是[命令。它具有多项增强功能,如果您编写针对 bash 的脚本,它会成为更好的选择。我最喜欢的是:

  1. 它是 shell 的一个语法特征,因此它有一些特殊的行为:[没有。您不再需要像 mad 这样引用变量,因为[[更直观地处理空字符串和带有空格的字符串。例如,与[你必须写

    if [ -f "$file" ]
    

    正确处理空字符串或带空格的文件名。和[[引号是不必要的:

    if [[ -f $file ]]
    
  2. 因为它是一个语法功能,所以它允许您使用&& and ||用于布尔测试的运算符和< and >用于字符串比较。[无法执行此操作,因为它是常规命令并且&&, ||, <, and >不会作为命令行参数传递给常规命令。

  3. 它有一个美妙的=~用于进行正则表达式匹配的运算符。和[你可能会写

    if [ "$answer" = y -o "$answer" = yes ]
    

    With [[你可以写成

    if [[ $answer =~ ^y(es)?$ ]]
    

    它甚至可以让您访问它存储的捕获组BASH_REMATCH。例如,${BASH_REMATCH[1]}如果您在上面输入完整的“yes”,则将是“es”。

  4. 您可以免费获得模式匹配(又称通配符)。也许您对如何输入 yes 不太严格。如果用户输入 y-任何内容,也许你没问题。为您提供帮助:

    if [[ $ANSWER = y* ]]
    

请记住,它是 bash 扩展,因此如果您正在编写与 sh 兼容的脚本,那么您需要坚持使用[。确保您拥有#!/bin/bash如果您使用双括号,则为您的脚本添加 shebang 行。

See also

  • Bash 常见问题解答 - “test、[ 和 [[ 之间有什么区别?” http://mywiki.wooledge.org/BashFAQ/031
  • Bash 实践 - Bash 测试 http://mywiki.wooledge.org/BashGuide/Practices#Bash_Tests
  • 服务器故障 - bash 中的双括号和单括号有什么区别? https://serverfault.com/questions/52034/what-is-the-difference-between-double-and-single-square-brackets-in-bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 中的 [ 和 [[ 有什么区别? [复制] 的相关文章

  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • 如何在 sed 中转义方括号[重复]

    这个问题在这里已经有答案了 我正在使用 grep 和 sed 解析遗留的 C 代码 当尝试替换方括号时 发生了一些奇怪的事情 以下代码替换方括号效果很好 echo xyx xzx xyx sed s g 结果是 xyx xzx xyx 当我
  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • grep 两个分隔符之间的子字符串

    我有很多bash使用的脚本perl内的表达式grep为了提取两个分隔符之间的子字符串 例子 echo BeginMiddleEnd grep oP lt Begin End 问题是 当我将这些脚本移植到运行的平台时busybox 融合的 g
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关

随机推荐

  • 组合正则表达式将驼峰式字符串拆分为单词

    通过使用 ridgerunner 在这个问题中建议的解决方案 我设法实现了一个将驼峰大小写转换为单词的函数 使用 php preg match 正则表达式 将驼峰式单词拆分为单词 https stackoverflow com questi
  • Xcode 中是否有用于循环编译指示标记或方法的键盘快捷键?

    我经常想在代码中的不同方法之间快速来回切换焦点 有键盘快捷键可以做到这一点吗 我可以做些什么来更快地获取 切换编译指示标记吗 Ctrl 6这会将焦点集中到文档项目列表上 然后你可以输入部分方法名称 它甚至可以巧妙地处理拼写错误 然后按下并回
  • java.lang.ClassCastException:android.widget.RelativeLayout

    我开发了一个简单的listview应用程序并显示listview但当我选择一个listview我收到以下错误 这是我的单个列表项 XML 文件
  • 事件滚动(scrollViewDidScroll)从未被调用 - Swift 3

    我想检测用户何时滚动 我使用了 UIScrollView 我在 ViewController 中实现了 UIScrollViewDelegate 并尝试了scrollViewDidScroll scrollViewDidEndScrolli
  • C# 中的转换/转换方法之间的区别

    有很多方法可以将对象转换 转换为另一个对象 这些方法之间有什么区别 如果没有区别 为什么有这么多方法来实现一件事 这不是对语言的伤害吗 假设对象 obj 到字符串 obj ToString obj as string string obj
  • 将 DockerHub IP 地址添加到白名单中

    我想知道 dockerhub 的 IP 地址 以便将它们添加到我的白名单中 我没有找到任何类型的文档 https help github com articles what ip addresses does github use that
  • 如何在具有多个时间序列的 GGPLOT 中插入图例

    我正在尝试在单个图表上绘制多个时间序列GGPLOT 数据集是一个数据框第一列的日期格式为日期 名为Time 以及其他列上的时间序列 名为V1 V2 等等 I tried gg1 ggplot geom line data PCA2 aes
  • Web 方法可以重载吗?

    我已经构建了一个常规的 NET asmx 服务 如何重载此服务中的 Web 方法 WS I Web 服务互操作性 不支持重载
  • window[] 和 eval() 之间的区别 - Javascript

    我一直在 javascript 中使用这两种方法 真的不知道有什么区别 谷歌搜索总是显示 窗口对象 或 在 javascript 中打开一个新窗口 的结果 因此找不到任何内容 eval v e window v e 有时 window 对我
  • 有关 .net Framework 4.7 中 ECDiffieHellmanCng 实现的秘密协议的问题吗?

    我有以下代码 var curve ECCurve NamedCurves nistP256 var ecdhSender ECDiffieHellman Create curve var ecdhReceiver ECDiffieHellm
  • 启用/禁用 Microsoft 虚拟 WiFi 微型端口

    我禁用了我的Microsoft Virtual WiFi Miniport网络适 配器来自Control Panel Network and Internet Network Connections 只需右键单击微型端口网卡并单击 禁用 它
  • 了解隐式声明的默认构造函数

    我试图了解编译器的默认构造函数是如何工作的 我做了这个例子 include
  • iOS/Android跨平台开发[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经尝试用 Java 开发 Android 应用程序有一段时间了 并且开始掌握它 然而 如果我想开始使用 iOS 版本 我需要从头开始编
  • 如何理解clojure的lazy-seq

    我正在尝试理解 Clojurelazy seq运算符 以及惰性求值的一般概念 我知道这个概念背后的基本思想 表达式的求值被延迟 直到需要该值为止 一般来说 这可以通过两种方式实现 在编译时使用宏或特殊形式 在运行时使用 lambda 函数
  • 从 Com Interop Assembly 中查找 COM DLL 路径

    我正在尝试围绕旧版 COM 对象编写一个包装器 并将该包装器安装到 GAC 中 目标是自动设置组件所需的特定配置信息 并为我的所有应用程序使用一个通用的强类型接口 到目前为止 我的解决方案是将 XML 配置文件保留在与原始 COM DLL
  • 计算差异考虑到我们有两个不同的时间和日期字符串,两次之间

    我将时间数据分为两个字符串 一个字符串表示日期 另一个字符串表示时间 我想计算差异 在Java中这样的两次 e g 时间 1 26 02 2011 和 11 00 AM 时间 2 27 02 2011 和 12 15 AM 相差大约 13
  • Java:从字符串中删除数值

    在该社区的帮助下 我成功地从用户输入中删除了数字值 但是 下面的代码将仅检索已删除的数字之前的字母字符 import java util Scanner public class Assignment2 A public static vo
  • Android:更改默认家庭应用程序

    对于某些特定要求 我需要更改 Android 默认主页应用程序 使用我的自定义主页应用程序 我的应用程序内的一个设置 将切换默认主页 我的应用程序或以前的主页 我不希望用户进行非常复杂的 Android 设置 任何人都可以帮我解决一下它在哪
  • 在哪里可以初始化模块范围的变量?

    我正在尝试做这样的事情 angular module MyModule ui config function rootScope rootScope Gender M Male F Female U Unknown 但我收到这个错误 未捕获
  • Bash 中的 [ 和 [[ 有什么区别? [复制]

    这个问题在这里已经有答案了 我查看了 bash 手册页和 说它使用条件表达式 然后我查看了条件表达式部分 它列出了与test and 所以我想知道 有什么区别 and 在巴什 bash 的改进是 命令 它具有多项增强功能 如果您编写针对 b