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

推荐阅读
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 字符常量与变量的定义及使用方法
    本文介绍了字符常量与变量的定义及使用方法,包括字符常量的定义、值和转义字符的表示方法;字符串常量的定义和结束标志;字符型数据与整型数据的区别;字符型变量的定义和内存占用;字符串变量的运算方法。同时提醒注意字符串常量不可赋值给字符型变量,需使用数组或指针进行存取。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级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社区 版权所有