热门标签 | 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;

推荐阅读
  • chrome安装reactdevtools开发工具
    我开始安装react-devtools的时候百度了一波,都是写的不清不楚,官网又都是英文的也不是完全理解,经过一番折腾出来以后,写个文档记录一下,也可避免新手首次安装走弯路我安装react-devtools的前提是本地安装了git以及node我相信准备学react的同学,应该都有了解使用1.首先打开官网:https:github.comfacebook ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 本文详细介绍了 C# 编程语言中 Main 方法的作用、不同形式及其使用场景,帮助开发者更好地理解和应用这一重要概念。 ... [详细]
  • 利用Excel VBA调用Linux命令及Bash脚本
    Excel VBA不仅能够处理日常办公任务,还具备调用外部命令行或Bash脚本的能力。本文将介绍如何使用VBA中的Shell函数来执行命令行指令,并通过实际示例展示如何获取计算机网络配置信息。 ... [详细]
  • JavaScript 面向对象编程中的继承机制
    本文详细介绍了JavaScript中实现类继承的几种常见方法,包括通过扩展Object的prototype、使用原型链以及利用call、apply和bind等技术手段。每种方法都有其特点和适用场景。 ... [详细]
  • 本文探讨了如何利用自定义URI方案和注册表编辑,在Windows操作系统中实现从Web浏览器启动本地应用程序的方法,同时强调了这一过程中的安全考虑。 ... [详细]
  • 十大排序算法JavaScript实现总结
    十大排序算法JavaScript实现总结,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文探讨了Go语言(Golang)的学习价值及其在Web开发领域的应用潜力,包括其独特的语言特性和为什么它是现代软件开发的理想选择。 ... [详细]
  • GNU 发布的 glibc 是 Linux 系统中最基础的 C 运行库,提供了一系列底层 API,几乎所有其他运行库都依赖于它。本文详细介绍了 glibc 的主要功能和服务,并探讨了其在系统开发中的重要性。 ... [详细]
  • 实践指南:利用Jenkins与JMeter实现自动化测试报告通知
    本文详细介绍了如何结合Jenkins和JMeter工具,通过自定义脚本向用户发送测试报告的通知。这不仅提高了开发团队的工作效率,也确保了信息的及时传递。 ... [详细]
  • 本文通过SystemTap工具详细分析了lvextend命令在SUSE12sp3系统上的执行流程。首先介绍了必要的软件安装步骤,随后展示了如何编写并运行SystemTap脚本来追踪命令执行过程中的函数调用,最后结合实际输出结果对关键函数进行了深入分析。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • Python作为一种广泛使用的高级编程语言,以其简洁的语法、强大的功能和丰富的库支持著称。本文将详细介绍Python的主要特点及其在现代软件开发中的应用。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • 本文探讨了一种有效的方法来检查数据库中是否已存在特定的用户名,如果不存在,则将其添加到数据库中。代码示例展示了如何使用SQL查询和C#编程实现这一功能。 ... [详细]
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社区 版权所有