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

news/2024/11/15 0:20: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

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


http://www.ppmy.cn/news/9228.html

相关文章

Hive SQL 每日SQL

1、查询订单明细表&#xff08;order_detail&#xff09;中销量&#xff08;下单件数&#xff09;排名第二的商品id&#xff0c;如果不存在返回null&#xff0c;如果存在多个排名第二的商品则需要全部返回。 需要用到的表&#xff1a; 订单明细表&#xff1a;order_detail 代码…

P10 PyTorch contour meshgrid

前言&#xff1a; 这两个函数是在画梯度图中经常用到的&#xff0c;简单了解一下 参考&#xff1a; python作图之plt.contour详解_你大佬来啦的博客-CSDN博客_plt.contour 目录&#xff1a; meshgrid contour 二维 contour 三维一 meshgrid 作用 创建网格点矩阵 输入&#…

[数据结构基础]栈和队列的结构及接口函数

一. 栈 1.1 栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一段进行插入和删除元素的操作。进行数据插入和删除的一端成为栈顶&#xff0c;另一端称为栈底。栈结构中的数据遵循先进后出原则&#xff08;LIFO&#xff1a;Last in First Out&#xff09;&am…

【数据篇】33 # 可视化数据处理的一般方法是什么?

说明 【跟月影学可视化】学习笔记。 数据可视化的一般过程 先看有什么样的数据&#xff1a;分析真实数据然后看想从数据中了解什么信息&#xff1a;获取想要的信息再决定使用何种可视化方式呈现&#xff1a;为数据选择正确的呈现形式最后看展示的效果怎么样&#xff0c;是否…

mysql 存储过程批量删除重复数据

mysql 存储过程批量删除重复数据 表结构&#xff1a; LOAD DATA INFILE /usr/local/phone_imsi_12 replace INTO TABLE tbl_imsi2number_new FIELDS TERMINATED BY \t ENCLOSED BY (number,imsi); 先用SQL语句来进行去重操作&#xff1a; delete from tbl_imsi2number_new …

191:vue+openlayers 选择feature,固定按钮删除selected feature

第191个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,通过按键来删除selected的feature。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共95行)相关API参考专栏目标…

Qt编译CTK

文章目录一、CTK简介二、CTK下载三、CTK编译一、CTK简介 CTK是什么 CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit CTK 提供了什么 当前&#xff0c;CTK 工作的主要范围包括&#xff1a; DICOM&#xff1a;提供了从 PACS 和本地数据库中查询和…

redis配置文件

redis主要配置项&#xff1a; bind 0.0.0.0 #监听地址&#xff0c;可以用空格隔开后多个监听IP protected-mode yes #redis3.2 之后加入的新特性&#xff0c;在没有设置bind IP和密码的时候,redis只允许访问 127.0.0.1:6379&#xff0c;远程访问将提示警告信息并拒绝远程访问…