Linux Bash单方括号与双方括号 [和[[的区别

2023-11-09

本文参考 Burak Gökmen 的文章 Differences Between Single and Double Brackets in Bash

  1. 单括号 [ 是 shell builtin,即 test 内置命令:
$ type [
[ is a shell builtin
$ [ 3 -eq 3 ] && echo “Numbers are equal”
Numbers are equal
$ test 3 -eq 3 && echo “Numbers are equal”
Numbers are equal

[] 和 test 之间没有任何区别。[ 对于任何 Unix / Linux 系统的 Shell 都可用,因为它是 POSIX 兼容的。
双括号 [[ 是 shell keyword 关键字:

$ type [[
[[ is a shell keyword

[[ 对于绝大多数 Shell 如 Bash、Zsh 等都可用,但是它并非 POSIX 兼容的。

  1. 比较运算符(大于号 > 和小于号 <)在 [[]] 内可以直接使用,但在 [] 内需要转义:
$ [[ 1 < 2 ]] && echo “1 is less than 2”
1 is less than 2
$ [ 1 < 2 ] && echo “1 is less than 2”
bash: 2: No such file or directory
$ [ 1 \< 2 ] && echo “1 is less than 2”
1 is less than 2

这是因为 [] 内将 < 和 > 默认当作是文件重定向符号。

  1. 布尔运算符(且 && 和或 ||)在 [[]] 内可以直接使用,但在 [] 内只能用 -a-o
$ [[ 3 -eq 3 && 4 -eq 4 ]] && echo “Numbers are equal”
Numbers are equal
$ [ 3 -eq 3 -a 4 -eq 4 ] && echo “Numbers are equal”
Numbers are equal
  1. 表达式分组:在 [[]] 内可以直接用圆括号 () 分组,但在 [] 内需要转义:
$ [[ 3 -eq 3 && (2 -eq 2 && 1 -eq 1) ]] && echo “Parentheses can be used”
Parentheses can be used
$ [ 3 -eq 3 -a (2 -eq 2 -a 1 -eq 1) ] && echo “Parentheses can be used”
bash: syntax error near unexpected token ‘(‘
$ [ 3 -eq 3 -a \( 2 -eq 2 -a 1 -eq 1 \) ] && echo “Parentheses can be used”
Parentheses can be used

并且 [] 内的圆括号前后都需要加空格。

  1. 模式匹配仅在 [[]] 内有效,在 [] 内无效:
$ name=”Alice”
$ [[ $name = *c* ]] && echo “Name includes c”
Name includes c
$ echo $?
0
$ [ $name = *c* ] && echo “Name includes c”
$ echo $?
1
  1. 正则表达式仅在 [[]] 内有效,在 [] 内无效:
$ name=”Alice”
$ [[ $name =~ ^Ali ]] && echo ”Regular expressions can be used”
Regular expressions can be used
$ [ $name =~ ^Ali ] && echo ”Regular expressions can be used”
bash: [: =~: binary operator expected

其中,=~ 内置运算符表示正则表达式匹配。

  1. 词分割:如果一个变量是一个包含空格的字符串,那么在 [[]] 内字符串不会被分割成多个词,但是在 [] 内会被分割成多个词:
$ filename=”nonexistent file”
$ [[ ! -e $filename ]] && echo ”File doesn’t exist”
File doesn’t exist
$ [ ! -e $filename ] && echo ”File doesn’t exist”
bash: [: nonexistent: binary operator expected

如果想在 [] 内避免这种情况,需要将变量用双引号包裹:

$ filename=”nonexistent file”
$ [ ! -e “$filename” ] && echo ”File doesn’t exist”
File doesn’t exist

总结而言,[[ 是增强版的 [。如果追求绝对的兼容性,那么应使用 [,但是一般而言追求方便,使用 [[ 即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Bash单方括号与双方括号 [和[[的区别 的相关文章

  • 将儒略时间戳转换为 UNIX 中的常规时间

    我需要使用 Bash 将 UNIX 中的 Julian 时间戳转换为常规时间戳 在 Tandem OS 上 转换非常简单 例子 212186319010244541 OLSAPP SYSTST 1 gt interprettimestamp
  • 如何隐藏显示终端命令输出

    当我运行这个命令时 sudo htpasswd b home reynolds htpasswd admin admin 我正在得到输出Updating password for user admin在终端中 但我不想显示该输出 所以我在谷
  • 如何在bash中进行二进制加法

    我正在尝试将两个 32 位二进制数相加 其中之一是常数 address range in binary 另一个是数组的元素 IPinEachSubnet val 我正在尝试按照说明进行操作here https www linuxquesti
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 期待、互动,然后再次期待

    有几篇关于相同内容的帖子 但我仍然无法使我的期望脚本正常工作 我的目的是自动化一切 但保留用户输入的密码 所以脚本有 3 个部分 自动登录 给予用户交互以输入密码 将控制权交还给 Expect 脚本以继续工作 所以我有一个将生成的脚本 其中
  • 如何使用 jq 和 Bash 将 JSON 展平为 Key=Selector 的 Bash 关联数组?

    作为后续展平任意 JSON https stackoverflow com questions 42299905 using jq flatten arbitrary json to delimiter separated flat dic
  • Linux Shellcode“你好,世界!”

    我有以下可用的 NASM 代码 global start section text start mov eax 0x4 mov ebx 0x1 mov ecx message mov edx 0xF int 0x80 mov eax 0x1
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置
  • 在 Bash 中从文本文件创建数组

    脚本采用 URL 解析它的所需字段 并将其输出重定向以保存在文件中 file txt 每次找到字段时 输出都会保存在新行中 file txt A Cat A Dog A Mouse etc 我要拿file txt并在新脚本中从中创建一个数组
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 我如何知道用户在使用 ncurses (Linux) 的控制台中按下了 ESC 键?

    I have a problem in detecting whether I just got a plain ESC key just code 27 or whether it was another special key such
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • '>&0' 有用途吗(重定向到标准输入)?

    在 bash 中你可以这样做 echo test gt 1 重定向到标准输出 尽管它已经到那里了 echo test gt 2 重定向到标准错误 echo test gt 0 重定向到标准输入 当我做最后一个时 我的终端仍然打印test就像

随机推荐

  • vue-pure-admin项目的学习

    前言 感谢作者的开源 让我们有机会学习 项目地址 vue pure admin 只是记录自己的学习 有问题地方感谢指正 只会记录一些自己目前感觉有用的知识点 代码demo都是基于vue3 ts element plus 目录结构 src a
  • 初步判断,学ue4的捷径就是先学好unity

    这两天 看Unity 发现和ue4都是组件式编程 基本上如出一辙 只是Unity更简单些 资料丰富些 学Ue4 是c 的问题么 我认为是游戏理念的问题 不懂游戏 更不会用组件式引擎写游戏 即 不懂业务 只能写slate 好比 学会c 了就会
  • 【翻译ver】LesaNet论文阅读(CVPR2019)——医学影像

    Holistic and Comprehensive Annotation of Clinically Signi cant Findings on Diverse CT Images Learning from Radiology Rep
  • getchar函数输入与缓冲区

    文章目录 目录 文章目录 前言 一 1 缓冲区是什么 2 为什么要有缓冲区 二 1 getchar函数与缓冲区 2 getchar清理缓存区 总结 前言 介绍了解getchar函数及其在缓冲区中的应用 一 1 缓冲区是什么 缓冲区又称为缓存
  • react+vite+ts+antdesign项目搭建-20220802

    react vite ts antdesign项目搭建 可同时参考vue3 vite ts Elementplus项目搭建 20220802 目录 react vite ts antdesign项目搭建 可同时参考vue3 vite ts
  • unity创建脚本生成头部注释( 作 者,文件路径,创建日期,功能描述)

    像这样 region HeadComments Copyright C YEAR DEVELOPERS 作 者 AUTHOR 文件路径 FILEPATH 创建日期 CREATIONDATE 功能描述 endregion using Unit
  • Linux下删除文件名中包含特殊字符的文件

    Linux下删除文件名中包含特殊字符的文件 在windows下不管什么文件名的文件delete一下全废掉 再顽固的用第三方软件粉碎一下就ok 在linux命令行下就不一样了 rm命令时常删除不掉拥有千奇百怪的文件名 特殊字符 超长字符 各种
  • 结合promise与websocket的发布/订阅模式实践

    结合promise与websocket的发布 订阅模式实践 本文初衷 最近恰好在公司做了一个聊天室系统 所以在系统中做了一下对websocket进行的promise化改造 所以想写篇文章总结一下 如果大家有什么更好的方法或者心得感悟 欢迎交
  • 鸿蒙3.0怎么升级,升级鸿蒙OS3.0机型曝光!大哥,你是认真的吗?

    鸿蒙OS系统 可真是 千呼万唤始出来 啊 自2017年华为开始研发鸿蒙内核1 0 2018年进展至鸿蒙内核2 0 2019年正式推出了鸿蒙OS1 0系统 并在发布会上预计2021年发布鸿蒙OS3 0系统 虽然在开发者大会上 华为宣布在智能手
  • notepad++ 如何以16进制比较两个文件

    Notepad 不支持直接以十六进制比较两个文件 但你可以通过使用插件来实现这个功能 以下是使用 Compare Plugin 插件进行文件比较的步骤 安装 Compare Plugin 插件 打开 Notepad 点击菜单栏的 插件 Pl
  • 如何在Java中使用protobufjava进行protobuf生成器编写

    作者 禅与计算机程序设计艺术 最近随着微服务架构的流行 越来越多的人选择了基于RPC框架 比如dubbo springcloud 实现服务之间的通信 而这些RPC框架默认使用的协议则是基于Google的Protocol Buffers 简称
  • 几种优化(求最优解)算法的比较

    遗传算法 优点是能很好的处理约束 能很好的跳出局部最优 最终得到全局最优解 全局搜索能力强 缺点是收敛较慢 局部搜索能力较弱 运行时间长 且容易受参数的影响 遗传算法适合求解离散问题 具备数学理论支持 但是存在着汉明悬崖等问题 模拟退火 优
  • ChatGPT与人类情感理解的挑战:解读复杂的情绪和态度

    导言 人类情感是复杂而多变的 涉及各种情绪 态度和情感表达方式 对于机器来说 理解和解读人类情感是一项具有挑战性的任务 然而 随着自然语言处理技术的进步 像ChatGPT这样的模型逐渐能够参与人类情感的解读和理解 本文将探讨ChatGPT在
  • 面试题-面经及知识重点

    1 葵花宝典 https blog csdn net jackfrued article details 44921941 1 面试整理 http www jfox info gao shou zheng zheng li java che
  • 计算机毕业设计之垃圾分类公益回收管理系统

    垃圾分类公益回收管理系统的开发过程中 采用B S架构 主要使用Java技术进行开发 结合最新流行的springboot框架 使用Mysql数据库和Eclipse开发环境 该垃圾分类公益回收管理系统包括用户 回收者和管理员 其主要功能包括垃圾
  • jstl引入maven项目常见问题

    在jsp页面中引入jstl标签库报错问题 1 引入标签时报错 排查历史 最后尝试通过降低jstl版本解决问题 2 jstl 在eclipse 中无法使用 解决方案 jstl jar 与 stand jar 单独下载而没有带c tld文件 下
  • idea 创建application.yml文件不变小叶子的解决方法

    首先你的确保你的pom xml中的包是全的 1 点击 2 选到你没有变小叶子的项目 3 将Spring加进去
  • SQL 快速插入数据 1000万条数据

    insert into 表名 select generate series 0 10000000 md5 random text clock timestamp
  • Unity内实现高级相机效果

    Cinemachine插件可以快速实现各种相机效果 例如跟随 分镜 推拉式镜头等 配合Timeline可以创建Cinemachine Track实现动画融合 从PackageManager上可以下载Cinemachine插件 它有以下几种类
  • Linux Bash单方括号与双方括号 [和[[的区别

    本文参考 Burak G kmen 的文章 Differences Between Single and Double Brackets in Bash 单括号 是 shell builtin 即 test 内置命令 type is a s