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

推荐阅读
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • 本文详细探讨了C语言中指针的概念,特别是指针在变量和数组中的应用。通过实例讲解,帮助读者更好地掌握指针的使用方法。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
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社区 版权所有