热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LinuxShell中的括号和整数扩展使用方法

本文介绍了LinuxShell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。

linux shell:[1] ()、(())、[]、[[]]、{}使用方法

1.()


  • 命令组。

    括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号’;’隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。

  • 命令替换。

    等同于`command`,shell扫描一遍命令行,发现了(command),便(command)中的command执行一次,得到其标准输出,再将此输出放到原来命令。

  • 用于初始化数组。

    如:array=(a b c d e f)


2.(())


  • 整数扩展。

    这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是”false”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。

  • 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进制转十进制)

  • 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++))可将 $a 重定义为6

  • 常用于算术运算比较&#xff0c;双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合C语言运算规则&#xff0c;比如可以直接使用for((i&#61;0;i<5;i&#43;&#43;))&#xff0c; 如果不使用双括号&#xff0c; 则为for i in &#96;seq 0 4&#96;或者for i in {0..4}。再如可以直接使用if (($i<5))&#xff0c; 如果不使用双括号&#xff0c; 则为if [ $i -lt 5 ]


3.[]


  • bash 的内部命令&#xff0c;[和test是等同的。如果我们不用绝对路径指明&#xff0c;通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识&#xff0c;右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试&#xff0c;并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号&#xff0c;但是新版的Bash中要求必须这样。

  • test和[]中可用的比较运算符只有&#61;&#61;和!&#61;&#xff0c;两者都是用于字符串比较的&#xff0c;不可用于整数比较&#xff0c;整数比较只能使用-eq&#xff0c;-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用&#xff0c;对于字符串比较可以使用转义形式&#xff0c;如果比较”ab”和”bc”&#xff1a;[ ab \&#xff0c;结果为真&#xff0c;也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。

  • 字符范围。用作正则表达式的一部分&#xff0c;描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

  • 在一个array 结构的上下文中&#xff0c;中括号用来引用数组中每个元素的编号。


4.[[]]


  • [[是 bash 程序语言的关键字。并不是一个命令&#xff0c;[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割&#xff0c;但是会发生参数扩展和命令替换。

  • 支持字符串的模式匹配&#xff0c;使用&#61;~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式&#xff0c;而不仅仅是一个字符串&#xff0c;比如[[ hello &#61;&#61; hell? ]]&#xff0c;结果为真。[[ ]] 中匹配字符串或通配符&#xff0c;不需要引号。

  • 使用[[ … ]]条件判断结构&#xff0c;而不是[ … ]&#xff0c;能够防止脚本中的许多逻辑错误。比如&#xff0c;&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中&#xff0c;但是如果出现在[ ]结构中的话&#xff0c;会报错。比如可以直接使用if [[ $a !&#61; 1 && $a !&#61; 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a !&#61; 2 ]或者if [ $a -ne 1 -a $a !&#61; 2 ]

  • bash把双中括号中的表达式看作一个单独的元素&#xff0c;并返回一个退出状态码。


4.{}


  • 大括号拓展。

    1. 对大括号{}中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。
    2. 对大括号{}中以点点&#xff08;..&#xff09;分割的顺序文件列表起拓展作用&#xff0c;如&#xff1a;touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt。
  • 代码块&#xff0c;又被称为内部组&#xff0c;这个结构事实上创建了一个匿名函数 。

    与()中的命令不同&#xff0c;{}内的命令不会新开一个子shell运行&#xff0c;即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开&#xff0c;最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

  • 特殊的替换结构

    1. ${var:-string}和${var:&#61;string}:若变量var为空&#xff0c;则用在命令行中用string来替换var:string&#xff0c;var&#xff0c;var{var:-string}&#xff1b;对于var:&#61;string{var:-string}是一样的&#xff0c;所不同之处是var:&#61;stringvar&#xff0c;string{var:&#61;string}的同时&#xff0c;把string赋给变量var&#xff0c;${var:&#61;string}很常用的一种用法是&#xff0c;判断某个变量是否赋值&#xff0c;没有的话则给它赋上一个默认值。
    2. ${var:&#43;string}的替换规则和上面的相反&#xff0c;即只有当var不是空的时候才替换成string&#xff0c;若var为空时则不替换或者说是替换成变量 var的值&#xff0c;即空值。
    3. ${var:?string}替换规则为&#xff1a;若变量var不为空&#xff0c;则用变量var的值来替换${var:?string}&#xff1b;若变量var为空&#xff0c;则把string输出到标准错误中&#xff0c;并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
  • 四种模式匹配替换结构

    1. ${variable%pattern}这种模式&#xff0c;shell在variable中查找&#xff0c;看它是否以给的模式pattern结尾&#xff0c;如果是&#xff0c;就从命令行把variable中的内容去掉右边最短的匹配模式
    2. ${variable%%pattern}这种模式&#xff0c;shell在variable中查找&#xff0c;看它是否以给的模式pattern结尾&#xff0c;如果是&#xff0c;就从命令行把variable中的内容去掉右边最长的匹配模式
    3. ${variable#pattern}这种模式&#xff0c;shell在variable中查找&#xff0c;看它是否以给的模式pattern开始&#xff0c;如果是&#xff0c;就从命令行把variable中的内容去掉左边最短的匹配模式
    4. ${variable##pattern}这种模式&#xff0c;shell在variable中查找&#xff0c;看它是否以给的模式pattern结尾&#xff0c;如果是&#xff0c;就从命令行把variable中的内容去掉右边最长的匹配模式

这四种模式中都不会改变variable的值&#xff0c;其中&#xff0c;只有在pattern中使用了匹配符号时&#xff0c;%和%%&#xff0c;#和##才有区别。结构中的pattern支持通配符&#xff0c;表示零个或多个任意字符&#xff0c;?表示仅与一个任意字符匹配&#xff0c;[…]表示匹配中括号里面的字符&#xff0c;[!…]表示不匹配中括号里面的字符。

  • 字符串提取和替换

    1. ${var:num}&#xff0c;shell在var中提取第num个字符到末尾的所有字符。若num为正数&#xff0c;从左边0处开始&#xff1b;若num为负数&#xff0c;从右边开始提取字串&#xff0c;但必须使用在冒号后面加空格或一个数字或整个num加上括号&#xff0c;如var:2{var:1-3}或${var:(-2)}。
    2. ${var:num1:num2}&#xff0c;num1是位置&#xff0c;num2是长度。表示从varnum1个位置开始提取长度为$num2的子串。不能为负数。
    3. ${var/pattern1/pattern2}表示将var字符串的第一个匹配的pattern1替换为另一个pattern2。
    4. ${var//pattern1/pattern2}表示将var字符串中的所有能匹配的pattern1替换为另一个pattern2。



  • 我的个人主页&#xff1a;http://www.techping.cn/
  • 我的个人站点博客&#xff1a;http://www.techping.cn/blog/wordpress/
  • 我的CSDN博客&#xff1a;http://blog.csdn.net/techping
  • 我的简书&#xff1a;http://www.jianshu.com/users/b2a36e431d5e/timeline
  • 我的GitHub&#xff1a;https://github.com/techping
    欢迎相互follow&#xff5e;

推荐阅读
  • 在 Go 开发环境中,通过使用 iTerm 和 Oh My Zsh,可以显著提升终端操作的效率和体验。Oh My Zsh 是一个强大的 Zsh 配置管理框架,提供了丰富的插件支持,如代码高亮、自动补全和多种编程语言支持,同时还拥有众多美观的主题,使终端界面更加个性化和高效。Zsh 作为一种高度可定制的 shell,不仅适用于交互式应用,还可用作脚本解释器,集成了 bash、ksh 和 tcsh 等其他 shell 的诸多优点,并具备独特的功能特性。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • 提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南
    提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • NOI题库(noi.openjudge.cn):1.7 编程基础之字符串 T31 至 T35 详解与解析
    T31至T35题目详细解析了字符串处理的基础编程技巧。其中,T31涉及P型编码,要求将一个仅包含数字字符的字符串转换为特定格式的编码串。例如,输入字符串“111223”应输出相应的P型编码结果。其他题目则涵盖了字符串的多种操作和变换方法,包括但不限于子串提取、字符替换和模式匹配等,旨在提升编程者对字符串处理的综合能力。 ... [详细]
  • 本文探讨了在PowerShell中高效管理和操作大规模内存对象的技术与实践。详细介绍了如何启用PowerShell的大内存支持功能,并提供了优化性能和减少资源消耗的具体方法。此外,还讨论了常见问题及其解决方案,旨在帮助用户在处理复杂数据集时提高效率和稳定性。 ... [详细]
  • 本文深入探讨了 C# 中 `SqlCommand` 和 `SqlDataAdapter` 的核心差异及其应用场景。`SqlCommand` 主要用于执行单一的 SQL 命令,并通过 `DataReader` 获取结果,具有较高的执行效率,但灵活性较低。相比之下,`SqlDataAdapter` 则适用于复杂的数据操作,通过 `DataSet` 提供了更多的数据处理功能,如数据填充、更新和批量操作,更适合需要频繁数据交互的场景。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本课程详细解析了Spring AOP的核心概念及其增强机制,涵盖前置增强、后置增强和环绕增强等类型。通过具体示例,深入探讨了如何在实际开发中有效运用这些增强技术,以提升代码的模块化和可维护性。此外,还介绍了Spring AOP在异常处理和性能监控等场景中的应用,帮助开发者更好地理解和掌握这一强大工具。 ... [详细]
  • 首篇待优化改进的文章
    本文介绍了多种常用的矩阵类型及其生成方法,包括单位矩阵、全零矩阵、全1矩阵以及均匀分布的随机矩阵。此外,还探讨了生成随机Markov矩阵的技术,并详细解释了线性等分向量和对数等分向量的构建方式,以及矩阵对数运算的应用。这些内容为数值计算和数据处理提供了坚实的基础。 ... [详细]
author-avatar
天佑忍者忍着
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有