当前位置: 首页 > Linux

LinuxShell中()、(())、[]、[[]]、{}的作用_0

时间:2023-04-07 01:38:54 Linux

1.圆括号,圆括号()1.单圆括号()①命令组。括号中的命令将打开一个新的子shell并按顺序执行它们,因此脚本的其余部分不能使用括号中的变量。括号中的多个命令用分号分隔,最后一个命令可以没有分号,每个命令和括号之间不需要空格。②命令替换。相当于cmd,shell扫描命令行,找到结构,然后在(cmd)中执行一次cmd,得到标准输出,然后把这个输出放到原来的命令中。有些shell不支持它,例如tcsh。③用于初始化数组。如:数组=(abcd)2、双括号(())①整数展开。本扩展计算为整数计算,不支持浮点数计算。((exp))构造扩展并评估算术表达式。如果表达式的结果为0,则返回的退出状态代码为1,即“false”,而表达式返回的非零值退出状态代码将为0,即“true”。如果是逻辑判断,则表达式exp为真则为1,为假则为0。②括号中的运算符和表达式只要符合C语言的运算规则,就可以在((exp))中使用,甚至是三元运算符。在进行不同基数(如二进制、八进制、十六进制)运算时,输出结果均自动转为十进制。例如:echo((16#5f))结果为95(16进制转换)③简单使用(())也可以重新定义变量值,如a=5;((a++))可以将$a重新定义为6④常用于算术运算比较,双括号中的变量不需要使用符号前缀。括号内支持多个表达式,并用逗号分隔。只要括号内的表达式符合C语言的运算规则,例如for((i=0;i<5;i++))可以直接使用,如果不用双括号,就是foriin'seq04'或foriin0..4。再比如if((i<5))可以直接使用,如果不用双括号,就是if[$i-lt5]。二、括号、方括号[]1、单括号[]①Bash的内部命令,[和test是等价的。如果我们不指定绝对路径,通常我们使用bash自带的命令。if/test结构中左方括号是调用test的命令标识,右方括号是结束条件的判断。此命令将其参数作为比较表达式或文件测试,并根据比较结果返回退出状态代码。if/test结构中不需要右方括号,但在新版本的Bash中是必需的。②Test和[]中可用的比较运算符只有==和!=,它们都用于字符串比较,不用于整数比较。整数比较只能使用-eq,-gt的形式。字符串比较和整数比较都不支持大于号而不是小于号。如果你真的要用它,你可以使用转义形式进行字符串比较。如果比较“ab”和“bc”:[ab运算符在[[]]条件判断结构中正常可以存在,但如果出现在[]结构中就会报错。例如if[[$a!=1&&$a!=2]]可以直接使用,如果不用双括号,就是if[$a-ne1]&&[$a!=2]或者如果[$a-ne1-a$a!=2]。④bash将双方括号中的表达式视为单个元素并返回退出状态代码。示例:if($i<5)if[$i-lt5]if[$a-ne1-a$a!=2]if[$a-ne1]&&[$a!=2]if[[$a!=1&&$a!=2]]foriin$(seq04);doecho$i;doneforiin`seq04`;doecho$i;donefor((i=0;i<5;i++));doecho$i;doneforiin{0..4};doecho$i;done3.花括号,花括号{}1.常规用法①花括号展开。(globbing)将扩展括在大括号中的文件名。在大括号内,不允许有空格,除非空格被引号或转义。第一个:展开花括号中以逗号分隔的文件列表。比如touch{a,b}.txt的结果是a.txtb.txt。第二种:在大括号中展开以点(..)分隔的顺序文件列表,如:touch{a..d}.txt结果为a.txtb.txtc.txtd.txt#ls{ex1,ex2}.shex1.shex2.sh#ls{ex{1..3},ex4}.shex1.shex2.shex3.shex4.sh#ls{ex[1-3],ex4}.shex1.shex2.shex3.shex4.sh②代码块,也称为innergroup,这个结构实际上创建了一个匿名函数。与括号中的命令不同,大括号中的命令不会打开新的子shell运行,即脚本的其余部分仍然可以使用括号中的变量。括号中的命令用分号隔开,最后一条也必须有分号。{}的第一个命令和左括号之间必须有一个空格。2、几种特殊的替换结构${var:-string}、${var:+string}、${var:=string}、${var:?string}①${var:-string}和${var:=string}:如果变量var为空,则在命令行中使用string替换${var:-string},否则,如果变量var不为空,则使用变量var的值替换${var:-细绳};${var:=string}的替换规则与${var:-string}相同,区别在于如果${var:=string}为空,则将${替换为stringvar:=string},而assigningstringtothevariablevar:${var:=string}一个很常见的用法是判断一个变量是否被赋值,如果没有,就给它赋一个默认值。②${var:+string}的替换规则与上面相反,即只有var不为空时才替换成string,var为空则不替换或替换成string变量var的值,即空值。(因为此时变量var为空,所以这两条语句是等价的)③${var:?string}替换规则为:如果变量var不为空,则将${var:替换为变量var的值:?细绳};如果变量var为空,则将字符串输出到标准错误并退出脚本。我们可以使用此功能来检查是否设置了变量的值。补充扩展:在以上五种替换结构中,字符串不一定是常量值,可以使用另一个变量的值或命令的输出。3.四种模式匹配替换结构模式匹配记忆方法:#是去掉左边(在键盘上#是在$的左边)%是去掉右边(在键盘上是%在$的右边)$)#和%中的单个符号为最小匹配,两个相同的符号为最大匹配。${var%pattern},${var%%pattern},${var#pattern},${var##pattern}第一个pattern:${variable%pattern},在这个pattern中,shell在变量Search查看是否以给定的patternpattern结尾,如果是,则从命令行的variable中的内容中去掉右边最短的匹配pattern第二个pattern:${variable%%pattern},在这个pattern中,shell在变量中查看是否以给定的模式pattern结尾,如果是则从命令行中取出变量中的内容和右边最长的匹配模式第三个模式:${variable#pattern}在这个pattern,shell在变量中查看它是否以给定的模式开头,如果是,则从命令行中删除左侧最短的匹配模式。第四种模式:${variable##pattern}在这个模式中,shell在变量中搜索,看它是否以给定的模式pattern结尾,如果是,从命令行中移除变量中的内容,并移除最长的匹配右边的图案。这四种模式都不会改变变量的值,其中,%和%%、#和##的区别仅在于模式中使用匹配符号时。结构中的模式支持通配符,这意味着零个或多个任意字符,?表示只匹配任意一个字符,[...]表示匹配方括号内的字符,[!...]表示不匹配方括号内的字符。#var=testcase#echo$vartestcase#echo${var%s*e}testca#echo$vartestcase#echo${var%%s*e}te#echo${var#?e}stcase#echo${var##?e}stcase#echo${var##*e}#echo${var##*s}e#echo${var##test}case4,字符串提取和替换${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}第一个pattern:${var:num},在这个pattern中,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字符串的第一个匹配模式替换为另一个模式。第四种模式:${var//pattern/pattern}表示将var字符串中所有匹配的模式替换为另一种模式。[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/cenths4.符号$(1)${a}变量后的括号a、花括号的值在没有歧义的情况下可以省略。(2)$(cmd)命令替换与cmd作用相同,结果是shell命令cmd的输入,但有些shell版本不支持$()形式的命令替换,如tcsh。(3)$((expression))与exprexpression作用相同,计算数学表达式exp的值,其中exp只需要符合C语言的运算规则,甚至三元运算符和逻辑表达式都可以计算。5.使用多条命令执行(1)单括号,(cmd1;cmd2;cmd3)打开一个新的子shell依次执行命令cmd1,cmd2,cmd3,每条命令之间用分号隔开,最后一条命令可以used没有分号。(2)单大括号,{cmd1;cmd2;cmd3;}在当前shell中依次执行命令cmd1,cmd2,cmd3,每条命令之间用分号隔开,最后一条命令后必须有分号,第一条命令并且左括号必须用空格分隔。对于{}和(),括号内的重定向符号只影响命令,而括号外的重定向符号影响括号内的所有命令。以上就是良序教程网为各位小伙伴分享的LinuxShell中的()、(())、[]、[[]]、{}的函数。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。