热门标签 | 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系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • 本文介绍如何从JSON格式的文件中提取数据并将其分配给Bash脚本中的变量。我们将探讨具体的命令和工具,帮助你高效地完成这一任务。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • Linux 基础命令详解
    本文介绍了在 Linux 系统中常见的命令及其用法。当用户登录系统后,默认提示符会显示为 [root@localhost ~]# 或 [user@localhost ~]$,其中 # 表示当前用户为 root,$ 表示普通用户。我们将深入探讨一些常用的 Linux 命令,帮助初学者更好地理解和使用这些工具。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
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社区 版权所有