[shell编程]、()、(())、[]、[[]]的区别

2023-10-27

默认的变量类型是字符串,所以  str1 == str2  ,就是一串字符串;我们想要判断它们是否相等必须使用中括号[ str1 == str2 ]。

1、中括号[ ]

[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格。
常用判断:
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。

字符串判断:
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]  如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

字典序中的排序是以新华字典的字母排序来进行的

数值判断
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=


逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

类似python的逻辑短路运算:
使用&& || 来实现
cmd1 && cmd2 如果cmd1执行成功,或者为真,则执行cmd2
cmd1 || cmd2 如果cmd1执行不成功,或者为假,则执行cmd2
cmd1 && cmd2 || cmd3  如果cmd执行成功,就执行cmd2,不成功就执行cmd3

2、双中括号[[ ]]

[[ $hh == d* ]]   查看这个变量是否字符d开头

3、中括号和双中括号的区别

区别一:[[ ]],碰到空白会进行分词

区别二:

[ ]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有的Shell解释器中

[[ ]]仅可运行在特定的几个Shell解释器中(如Bash等)

区别三:<和>在[[ ]]中用作排序,而[ ]不支持

[root@fttswlp menu]# [[ 6 > a  ]]  # ASCII码中6是小于a的
[root@fttswlp menu]# echo $?
1
[root@fttswlp menu]# [ 6 > a ]
[root@fttswlp menu]# echo $?
0

区别四:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示

[[ ]]不支持-a

[root@fttswlp menu]# [ a == a -a b == b ] && echo Y || echo N
Y
[root@fttswlp menu]# [[ a == a -a b == b ]] && echo Y || echo N
-bash: 条件表达式中有语法错误
-bash: `-a' 附近有语法错误
[root@fttswlp menu]# [[ a == a && b == b ]] && echo Y || echo N
Y

区别五:[ ]支持正则匹配,[[ ]]支持用=~进行正则匹配

[[ ]]判断变量fairy的值是否包含字母c

[root@fttswlp menu]# [ $fairy =~ "c" ] && echo Y || echo N
-bash: [: =~: 期待二元表达式
N
[root@fttswlp menu]# [[ $fairy =~ "c" ]] && echo Y || echo N
Y

区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持

在这里插入图片描述

区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要

在这里插入图片描述

4、小圆括号

  1. 命令组。括号中的命令将会新开一个子she顺字执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
  2. 命令替换。等同于cmd,shell扫描一遍命令行,发现了结构,便将(omd)结构,便将(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到来命令。有些shell不支持,tcsh。
  3. 用于初始化数组。如: array=(a b c d)

5、双圆括号

  1. 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。(exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是"假",而一个非零值的表达式所返回的退出状态码将为O,或者是"rue"。若是逻辑判断,表达式exp为真则为1,假则为0。
  2. 只要括号中的运算符、表达式符合C语言运算规则,都可用在
  3. 单纯用(())也可重定义变量值,比如a=5; ((a++))可将$a重定义为6
  4. 常用于算术运算比较,双括号中的变量可以不使用
  5. 符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合C语言运算规则,比如可以直接使用for(f=0i<5i++)).如果不使用双括号,则为forinseq04'或者forin0...4。再如可以直接使用if((i<5)),如果不使用双括号,则为if [ $i -t 5 ]

若有问题,还望各位大佬指出

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

[shell编程]、()、(())、[]、[[]]的区别 的相关文章

  • 三元操作符

    通常N元操作符指的是该操作符有N个操作数 如赋值操作符 它是一个二元操作符 所以它有两个操作数 左右各一个 又如减号 是一个二元操作符 但是当它作为负号 使用的时候 便是一个一元操作符 它表示负数 所以只有一个操作数 那么 三元操作符理应有
  • python--unicodedata用法

    python unicodedata用法 需要掌握的 1 将Unicode字符 chr 转换为等效的数值 以浮点形式返回 print unicodedata numeric 四 4 0 2 将unicode字符 chr 转换为其等效的数字值
  • 【C语言初学必看】猜数字游戏背后的知识

    目录 前言 1 先看主体部分 大体逻辑的部分 a 为什么用do while循环 b switch语句 c 关于scanf 中的 d s 和 printf 的关系 d menu 和game 函数为什么没有返回值 e 为什么 intput 在w
  • ABAP 351 - 动态编程

    作为面对对象的编程语言 ABAP也是支持动态编程的 ABAP351作为一门独立的课程介绍了类反射机制如何实现的过程 一 Field Symbols Field Symbols 字段符号 在ABAP编程中经常使用 实际上它具备以下几点特性 字
  • citespace教程

    参考视频教程 CiteSpace保姆级教程1 文献综述怎么写 研究生写文神器 手把手教你做科学知识图谱 以中国知网为例 哔哩哔哩 bilibili Citespace 从下载到图谱分析 详细教程 基于CNKI和WOS 陈同学 哔哩哔哩 bi
  • “数”说程序员|“后浪”涌袭下的开发者现状

    红网时刻长沙10月23日讯 见习记者 赵翼鹏 10月23日至25日 长沙 中国1024程序员节 将盛大举行 为期3天的会议将以开源为主议题进行讨论 并包括了十多场技术论坛 多位操作系统领域大咖还将史上首次在岳麓山展开对话 为什么会是1024
  • BUCK和BOOST电路详解

    1 BUCK电路 BUCK是一种降压型电路 他的特征就是输出电压低于输入电压 输入的电流是脉动的 输出的电流是连续的 BUCK电路的原理图如下图所示 当开关管Q1驱动为高电平时 开关管导通 电感L1被充磁储能 流过电感的电流线性增加 同时给
  • 《无码的青春》第七章 御姐

    之前我们各有各的故事 各有各的守护 然而今天却成了同一类人 失去了各自的女神 失去了自己的信仰 没有了牵挂 也不再需要对什么人负责 四个单身男人 在这个浮华的城市里尽情的释放着过剩的荷尔蒙 周末我们会聚在道哥的酒吧里 在浮光掠影的酒精和静静

随机推荐

  • python3的turtle画模仿3d星空,运动的恒星小宇宙

    本文参考原文 http bjbsair com 2020 03 25 tech info 6248 html 1 宇宙 2 代码实现条件 python3 3 第1步 第1步 导入模块 from turtle import from rand
  • 8.Xaml Border控件

    1 运行图片 2 运行源码
  • 自定义滚动条@莫成尘

    先看代码 复制使用即可 以下代码均可复制粘贴使用 我将以注释的形式解释代码左右 您将看到以下效果 原生的滚动条比较方正 不够圆滑 很大程度上不能满足我们的审美 有时候需要修改其样式 滚动条的高度将随着内容的多少自适应
  • GOTC演讲回顾

    5月27 28日 由上海浦东软件园 开放原子开源基金会 Linux基金会亚太区和开源中国联合发起的2023全球开源技术峰会 Global Open source Technology Conference GOTC 在上海圆满召开 大会聚焦
  • Redis IO 多路复用底层的实现原理

    文章目录 前言 用户空间与内核空间 PIO 和 DMA PIO DMA 缓存I O和直接I O 缓存I O的读写操作 缓存I O的优点 缓存I O的缺点 直接I O的优点 IO的访问方式 磁盘IO 网络IO 磁盘IO和网络IO对比 同步IO
  • AG表格基础滚动分页-React版本

    AG表格滚动分页文档 AG表格在使用滚动分页时 不可使用rowData属性做为数据源 传入表格 因为AG的滚动分页 使用的是特殊表模型 所有正常模型下的API有可能会失效 使用AG滚动分页时 需把正常数据模型替换成滚动分页数据模型 示例 t
  • 30天自制操作系统学习-第2天

    第二天主要学习汇编语言与Makefile入门 1 继续开发 在这里先给出作者在第二天使用nask编写代码中涉及到的寄存器概念 AX accumulator 累加寄存器 CX counter 计数寄存器 DX data 数据寄存器 BX ba
  • 反射工具类导入Excel数据到数据库

    1 工作类代码 import org apache poi hssf usermodel HSSFWorkbook import org apache poi ss usermodel import org apache poi xssf
  • ubuntu20.04换国内清华源和安装docker

    写在前面 安装好ubuntu双系统后 默认的软件更新源是国外的 在国内使用速度很慢 用 apt install xxx 安装软件时可能出现 网络不可达 你的网络需要认证吗 无法定位软件包 等错误 所以我们需要更换成国内的源 这样才能正常安装
  • c++读写文件操作

    程序的运行产生的数据都是临时数据 不能持久的保存 一旦程序运行结束数据就会被释放 在C 中对文件进行操作必须包含头文件
  • Flutter开发中插件使用

    flutter的库是以package的方式来管理的 Package 分为两种 Dart package 它只能使用 Dart 和 Flutter 提供的 API 使用纯dart语言开发 一些Dart包可能包含Flutter特定功能 因此对F
  • chatgpt赋能python:Python编程优化技巧

    Python编程优化技巧 为什么需要编程优化 Python是一种解释性语言 运行速度较慢 编写高效的Python程序是很有必要的 当我们需要处理大量数据 或者运行时间敏感的任务时 优化Python程序对于提高效率是至关重要的 怎样提高Pyt
  • 华为OD机试 C++ 【查字典】

    题目 题目 描述 给你一个 头 就是词的开始部分 和一个单词清单 你需要找出哪些单词是以这个 头 开始的 输出 所有以这个 头 开始的单词 每个单词一行 如果一个都没有 输出 1 输入 abc 4 a ab abc abcd 输出 abc
  • 项目结构的合理性

    以下仅为个人观点 如有好的建议请多多指教 1 有时为了项目以后修改 迭代 或者相似功能的开发 可能会对某些模块进行封装 近期所做的项目整体进行了自动化封装 个人认为封装过度其实是对后续业务并没有太多好处 反而造成项目随着时间的推移 业务发展
  • sessionStorage 问题

    问题描述 列表页点击进详情页的时候数据没加载到 查看前端代码 在跳转的时候取的列表页数据存到sessionStorage里面 function getCollarDetails index var rows coupon list tabl
  • jQuery 入门教程(21): jQuery UI 示例

    上篇介绍了使用jQuery UI基本工作过程 后面就逐个介绍jQuery UI库内置的UI组件 支持的拖放 动画效果等 如果你之前看过Yii Framework教程 PHP Yii Framework封装了jQuery UI组件 有兴趣的可
  • SqlServer 存储过程(生成订单)

    当在 SQL Server 中处理订单时 使用存储过程可以提供更高效和可维护的解决方案 存储过程是一组预编译的 SQL 语句 可以在数据库中执行 并且可以通过参数进行自定义 通过使用存储过程 可以将常见的业务逻辑封装起来 以便在需要时进行重
  • error while loading shared libraries: ../../lib/libopencv_core.so

    error while loading shared libraries lib libopencv core so 原文 http blog chinaunix net uid 27134408 id 5122776 html 最近做Op
  • SonarQube - org.sonar.process.MessageException: Unsupported JDBC driver provider: mysql

    使用docker安装最新的SonarQube 启动SonarQube报错 Exception in thread main org sonar process MessageException Unsupported JDBC driver
  • [shell编程]、()、(())、[]、[[]]的区别

    默认的变量类型是字符串 所以 str1 str2 就是一串字符串 我们想要判断它们是否相等必须使用中括号 str1 str2 1 中括号 表示条件测试 注意这里的空格很重要 要注意在 后面和 前面都必须要有空格 常用判断 d FILE 如果