Linux中的括号用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中的括号用法相关的知识,希望对你有一定的参考价值。
一、Linux中的小括号(也叫圆括号)“( )”的用法
1.单小括号()
1)数组赋值或者初始化数组;
2)子Shell赋值:小括号中的内容会开启一个子shell独立运行;括号中以分号连接,最后一个命令不需要;各命令和括号无需空格;
3)实现多条命令集合:新开多条命令来执行,各个命令之间用分号隔开,最后一个命令必须要分号来隔开;
4)与”$“结合实现命令替换:等同于cmd
扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。此形式要注意使用的Shell类型。
2.双小括号(())
1)省略”$“进行算术运算,同时支持在括号内用“,”对多个表达式进行分割:
2)$((exp)) 和expr exp效果相同,计算数学表达式exp的数值;计算逻辑运算(常用于算术运算比较,双括号中的变量可以不使用$,支持多个表达式用 ”,“ 来隔开);
3)支持跨进制运算:
二、Linux中的中括号(也叫方括号)“[ ]”的用法
1.单中括号 []
1)bash 的内部命令,[和test是等同的。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。
2)在进行比较运算时使用。test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较;整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab < bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
3)字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。比如:[0-9]、[a-z]等。
4)在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。
2.双中括号[[ ]]
1)[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
2)支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
3)使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
4) bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
三、Linux中的大括号(也叫花括号)“{ }”的用法
1.表达变量的值。在不发生歧义的情况下大括号可有可无,但建议添加上。
2.用大括号进行拓展:此时可以使用大括号对文件进行批量操作
1)第一种:对大括号中的以逗号分割的文件列表进行拓展。如:touch {file1,file2,file3}.sh。
2)第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用。如:touch {1..10}.sh
3.特殊替换——${var:-string},${var:+string},${var:=string},${var:?string}
1)${var:-string}:当变量var值为空时,${var:-string}会把string作为值,当变量var值不为空时,${var:-string}会把var的值作为变量。
2)${var:+string}:${var:+string}的替换规则和上面的相反,即当变量var的值不为空的时将值换成string,当变量var为空时则不替换或者说是替换成变量var的值,即空值。
3)${var:=string}:当变量var值为空时,${var:=string}会将其赋值为string,且变量var也被赋值是string了,若变量var不为空时,${var:=string}的值都是变量var的值。此规则和${var:-string}类似,但不同之处在于若变量为空时,此规则会将“=”后面的值赋给变量。(很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。)
4)${var:?string}:若变量var不为空,则使用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。可利用此特性来检查是否设置了变量的值。
注意:在上面这四种替换结构中string的位置不一定必须是一个常量的,也可以是一个变量或是一条指令。
4.模式匹配替换——${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
是去掉左边(在键盘上#在$之左边);% 是去掉右边(在键盘上%在$之右边);和%中的单一符号是最小匹配,两个相同符号是最大匹配。
1)第一种模式:${variable%pattern},这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,就把variable中的内容去掉右边最短的匹配模式。
2)第二种模式:${variable%%pattern},这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,就把variable中的内容去掉右边最长的匹配模式。
3)第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern开始,如果是,就把variable中的内容去掉左边最短的匹配模式。
4)第四种模式:${variable##pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,就把variable中的内容去掉右边最长的匹配模式。
这四种模式中都不会改变variable的值,其中,只有在pattern中使用了“”匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,“”表示零个或多个任意字符,“?”表示仅与一个任意字符匹配,[…]表示匹配中括号里面的字符,[!…]表示不匹配中括号里面的字符。
5.字符串提取和替换——${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
1)第一种模式:${var:num},shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。
2)第二种模式:${var:num1:num2},num1表示位置,num2表示长度。意思就是从$var字符串的第$num1个位置开始提取长度为$num2的子串。num1和num2均不能为负数。有负数出现时,将会自动忽略第二个“:”及其后面的内容,相当于是在执行${var:num}。
3)第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。
4)第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
6.多命令集合:
{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
以上是关于Linux中的括号用法的主要内容,如果未能解决你的问题,请参考以下文章