返回顶部
首页 > 资讯 > 服务器 >shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)
  • 306
分享到

shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)

括号详解作用 2022-06-04 21:06:26 306人浏览 安东尼
摘要

一、小括号,圆括号() 1、单小括号 ()   ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各

一、小括号,圆括号()

1、单小括号 ()

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

  ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。

  ③用于初始化数组。如:array=(a b c d)

2、双小括号 (( ))

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

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

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

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

二、中括号,方括号[]

1、单中括号 []

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

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

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

  ④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

2、双中括号[[ ]]

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

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

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

  ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

例子:


if ($i<5) 
if [ $i -lt 5 ] 
if [ $a -ne 1 -a $a != 2 ] 
if [ $a -ne 1] && [ $a != 2 ] 
if [[ $a != 1 && $a != 2 ]] 
for i in $(seq 0 4);do echo $i;done 
for i in `seq 0 4`;do echo $i;done 
for ((i=0;i<5;i++));do echo $i;done 
for i in {0..4};do echo $i;done

三、大括号、花括号 {}

1、常规用法

  ①大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt


# ls {ex1,ex2}.sh 
ex1.sh ex2.sh 
# ls {ex{1..3},ex4}.sh 
ex1.sh ex2.sh ex3.sh ex4.sh 
# ls {ex[1-3],ex4}.sh 
ex1.sh ex2.sh ex3.sh ex4.sh

  ②代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

2、几种特殊的替换结构


${var:-string},${var:+string},${var:=string},${var:?string}

  ①${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。

  ② ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)

  ③${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

  补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。

3、四种模式匹配替换结构

模式匹配记忆方法:

# 是去掉左边(在键盘上#在$之左边)
% 是去掉右边(在键盘上%在$之右边)
#和%中的单一符号是最小匹配,两个相同符号是最大匹配。


${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

  第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式

  第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

  第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式

  第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

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


# var=testcase 
# echo $var 
testcase 
# echo ${var%s*e} 
testca 
# echo $var 
testcase 
# echo ${var%%s*e} 
te 
# echo ${var#?e} 
stcase 
# echo ${var##?e} 
stcase 
# echo ${var##*e}
# echo ${var##*s} 
e 
# echo ${var##test} 
case

4、字符串提取和替换


${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

  第一种模式:${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。

  第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。

  第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。

  第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。


[root@Centos ~]# var=/home/centos 
[root@centos ~]# echo $var 
/home/centos 
[root@centos ~]# echo ${var:5} 
/centos 
[root@centos ~]# echo ${var: -6} 
centos 
[root@centos ~]# echo ${var:(-6)} 
centos 
[root@centos ~]# echo ${var:1:4} 
home 
[root@centos ~]# echo ${var/o/h} 
/hhme/centos 
[root@centos ~]# echo ${var//o/h} 
/hhme/cenths

四、符号$后的括号

(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

五、使用

1、多条命令执行

(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。

(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。

对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。

总结

以上所述是小编给大家介绍的shell中各种括号的作用()、(())、[]、[[]]、{}(推荐),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

--结束END--

本文标题: shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)

本文链接: https://lsjlt.com/news/18588.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)
    一、小括号,圆括号() 1、单小括号 ()   ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各...
    99+
    2022-06-04
    括号 详解 作用
  • shell中各种括号的作用是什么
    今天就跟大家聊聊有关shell中各种括号的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、小括号,圆括号()1、单小括号 ()  ①命令组。括号中的命令将会新开一个子sh...
    99+
    2023-06-09
  • 如何使用shell中的各种括号
    这篇文章主要讲解了“如何使用shell中的各种括号”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用shell中的各种括号”吧!在这里我想说的是几种shell里的小括号,大括号结构和有括...
    99+
    2023-06-09
  • shell中的各种括号的使用方法
    在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string...
    99+
    2022-06-04
    括号 使用方法 shell
  • Shell中的单中括号和双中括号的用法详解
    SHELL是Unix系统的用户与操作系统之间的一种接口。它既是UNIX系统的命令解释程序,又是一种高级的命令程序设计语言。作为命令解释程序,SHELL接收用户输入的命令,将命令翻译成一个动作序列,然后调用系统过程执行这条...
    99+
    2022-12-23
    Shell单中括号 Shell中的双中括号 Shell中括号
  • AngularJS 中括号的作用详解
    1.括号的作用 1.1方括号 [ ] 属性名加上方括号后,右侧赋值为 表达式的值 如果属性没有方括号,右侧赋值为 字符串 <div class="red">red&l...
    99+
    2024-04-02
  • shell 中小括号、中括号及大括号的区别解析
    目录一、小括号,圆括号()1、单小括号 ()2、双小括号 (( ))二、中括号,方括号[]1、单中括号 []2、双中括号[[ ]]三、大括号、花括号 {}1、常规用法2、几种特殊的替换结构一、小括号,圆括号() 1、单小...
    99+
    2022-06-04
    shell 小括号中括号大括号的区别 shell 小括号中括号大括号
  • Linux Shell中几种括号和引号的用法介绍
    本篇内容介绍了“Linux Shell中几种括号和引号的用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Shell 脚本中经常需要用到...
    99+
    2023-06-16
  • Shell脚本的超详细讲解(推荐!)
    目录一、Shell脚本基础概念1.1 什么是shell1.2 什么是shell脚本1.3 shell脚本的意义二、创建一个简单的Shell脚本2.1 创建一个shell脚本文件2.2 运行一个Shell脚本2.2.1 脚...
    99+
    2022-07-20
    shell脚本基本语法 shell脚本教程 shell脚本基本命令
  • 如何理解Shell中的中括号用法
    本篇文章给大家分享的是有关如何理解Shell中的中括号用法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。导读在计算机科学中,Shell俗称壳(用来区别于核),是指"为...
    99+
    2023-06-05
  • 详解Shell 脚本中 “$” 符号的多种用法
    通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 1到9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的...
    99+
    2022-06-04
    Shell $
  • c++中括号的作用
    方括号在 c++++ 中的作用 C++ 中的方括号有两种主要用途: 1. 数组索引 方括号用于访问数组中的元素。数组是一个固定大小的同类型数据的集合,每个元素都有一个称为索引的惟一整数标...
    99+
    2024-04-28
    c++
  • nginx中proxy_pass各种用法详解
    目录代理转发规则第一种:第二种:第三种:第四种:第五种:代理转发规则 nginx中配置location代理转发规则的时候不同写法对应不同转发规则。 如果proxy_pass使用了UR...
    99+
    2024-04-02
  • 详解Java中String类的各种用法
    目录一、创建字符串二、字符、字节与字符串的转换1.字符与字符串的转换2.字节与字符串的转换三、字符串的比较1.字符串常量池2.字符串内容比较四、字符串查找五、字符串替换六、字符串拆分...
    99+
    2024-04-02
  • C++const的各种用法详解
    目录const的基本概念:一、const修饰基本数据类型 1.const修饰一般常量及数组  2.const修饰指针变量*及引用变量& ...
    99+
    2023-05-17
    C++ const用法介绍 C++ const用法 C++ const
  • c语言中括号的作用
    括号在 c 语言中扮演多种角色,包括:定义变量类型和函数参数类型(圆括号);控制代码执行顺序(大括号);调用函数并传递参数(圆括号);改变表达式求值顺序(圆括号);访问数组元素(方括号)...
    99+
    2024-05-12
    c语言
  • 基于Java中的StringTokenizer类详解(推荐)
    StringTokenizer是字符串分隔解析类型,属于:Java.util包。1、StringTokenizer的构造函数StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象。...
    99+
    2023-05-31
    stringtokenizer java
  • 详解Java中$符的各种使用场景
    目录前言1. $符号七大应用场景1.1 内部类与匿名内部类1.2 Lambda表达式与方法引用1.3. 自动生成的字段与方法1.4. 自定义类名与变量名1.5. 生成的代码和工具1....
    99+
    2023-05-17
    Java $符使用场景 Java $符使用 Java $符
  • Android中FileProvider的各种场景应用详解
    目录前言一、常规使用与定义二、能不能自定义接收文件?三、能不能主动查询对方的沙盒?总结前言 有部分同学只要是上传或者下载,只要用到了文件,不管三七二十一写个 FileProvider...
    99+
    2024-04-02
  • 详解如何使用Python操作MySQL的各种功能
    目录连接mysql增删改查插入数据删除数据更新数据查询数据批量操作批量插入数据批量删除数据批量更新数据当今互联网时代,数据处理已经成为了一个非常重要的任务。而MySQL作为一款开源的关系型数据库,被广泛应用于各种场景。本...
    99+
    2023-04-19
    Python操作MySQL功能 Python操作MySQL Python MySQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作