Linux Shell中各种括号的功能(),(),[],[],{}-betway88客户端_betway88_必威官网下载

(给Python开发者加星标,提高Python技术

来历:乌托邦2号

blog.csdn.net/taiyang1987912/article/details/39551385

一、小括号,圆括号()


1、单小括号 ()


①指令组。括号中的指令将会新开一个子shell次序履行,所以括号中的变量不能够被脚本余下的部分运用。括号中多个指令之间用分号离隔,最终一个指令能够没有分号,各指令和括号之间不必有空格。


②指令替换。同等于`cmd`,shell扫描一遍Linux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 指令行,发现了$(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结构中的左Linux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 中括号是调用test的指令标识,右中括号是封闭条件判别的。这个指令把它的参数作为比较表达式或许作为文件测验,而且依据比较的成果来回来一个退出状况码。if/test结构中并不是有必要右中括号,可是新版的Bash中要求有必要这样。


②Test和[]中可用的比较运算符只需==和!=,两者都是用于字符串比较的,不行用于整数比较,整数比较只能运用-eq,-gt这种方式。无论是字符串比较仍是整数比较都不支撑大于号小于号。假如真实想用,关于字符串比较能够运用转义方式,假如比较"ab"和"bc":[ ab \< bc ],成果为真,也便是回来状况为0。[ ]中的逻辑与和逻辑或运用-a 和-o 表明。


③字符规模。用作正则表达式的一部分,描绘一个匹配的字符规模。作为test用处的中括号内不能运用正则。


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


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 !=&nb塞巴斯蒂安sp;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 
e双星之阴阳师x1.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输出到规范过错中,并从脚本中退出。咱们可Linux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 运用此特性来查看是否设置了变量的值。


弥补扩展:在上面这五种替换结构中string纷歧定是常值的,可用别的一个变量的值或是一种指令的输出。


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


方式匹配回忆办法:


# 是去掉左面(在键盘上#在$之左面)


% 是去掉右边(在键盘上%在$之右边)


#和%中的单一符号是最小匹配沈阳地图,两个相同符号是最大匹配。


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


第一种方式:${variab剃须刀Linux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 le%pattern},这种方式时,shell在variable中查找,看它是否一给的方式pattern结束,假如是,就从指令行把variable中的内容去掉右边最短的匹配方式


第二种方式: ${variable%%pattern},这种方式时,shell在variable中查找,看它是否一给的方式pattern结束,假如是全能旋转矩阵聪明组合,就极品狂少从指令行把variable中的内容去掉右边最长的匹配方式


第三种方式:${variable#pattern} Linux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 这种方式时,shell在variable中查找,看它是否一给的方式pattern开端,假如是,就从指令行把variable中的内容去掉左面最短的匹配方式


第四种方式: ${variaLinux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 ble##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}
#&nbs奇特宝物游戏p;echo ${var##*s} 

# echo ${var##test} 
case


4、字符串提取和替换


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


第一种方式:${v桃花扇ar:num},这种方式时,shell在var中提取第num个字符到结尾的一切字符。若num为正数,从左面0处开端;若num为负数,从右边开端提取字串,但有必要运用在冒号后边加空格或一个数字或整个num加上括号,如${var: -2}、${高阳公主var:1-3}或${var:(-2)}。


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


第三种方式:${var/patt爱漫画ern/pattern}表明将var字符串的第一个匹配的pattern替换为另一个pattern。


第四种方式:${var//pattern/pattern}表明将var字符串中的一切能匹配的pattern替换为另一个pLinux Shell中各种括号的功用(),(),[],[],{}-betway88客户端_betway88_必威官网下载 attern。


[root@centos ~]# var=/home/centos 
[root@centos ~]# echo $var 
/home/centos
[root@centosduration ~]# echo ${var:5
/centos
[root@centos ~]# echo ${var-6
centos 
[root@centos ~]# ech当爱已成往事o ${var:(-6)capacity} 
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)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell次序履行指令cmd1,cmd2,cmd3, 各指令之间用分号离隔, 最终一个指令后能够没有分号。


(2)单大括号,{ cmd1;cmd2;cmd3;} 在当时shell次序履行指令cmd1,cmd2,cmd3, 各指令之间用分号离隔, 最终一个指令后有必要有分号, 第一条指令和左括号之间有必要用空格离隔。


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



引荐阅览

(点击标题可跳转阅览)

这些 Linux 技巧大大提高你的工作效率

如安在 Linux 中装置、装备和运用 Fish Shell?

Bash 5.0 发布及其新功用



觉得本文对你有协助?请共享给更多人

重视「Python开发者」加星标,提高Python技术

好文章,我在看❤️

评论(0)