undefined此命令将其参数作为比较表达式或文件测试,并根据比较结果返回退出状态代码。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②代码块,也称为内部组,这个结构实际上创建了一个匿名函数。与括号中的命令不同,大括号中的命令不会打开新的子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为空时,不替换或替换为值变量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中的第一个patternAll从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/cenths四、符号$(1)${a}后的括号variablea的值,花括号在没有歧义的情况下可以省略。(2)$(cmd)命令替换与`cmd`效果相同,结果为shell命令cmd的输出,但有些shell版本不支持$()形式的命令替换,如tcsh.(3)$((expression))与`exprespression`作用相同。它计算数学表达式exp的值,其中exp只需要符合C语言的运算规则,甚至可以计算三元运算符和逻辑表达式。5.使用多条命令执行(1)单括号,(cmd1;cmd2;cmd3)打开一个新的子shell依次执行命令cmd1,cmd2,cmd3,每条命令之间用分号隔开,后面可以使用最后一个命令没有分号。(2)单花括号,{cmd1;cmd2;cmd3;}在当前shell中依次执行命令cmd1、cmd2、cmd3,每条命令之间用分号隔开,最后一条命令后必须有分号,第一条命令并且左括号必须用空格分隔。对于{}和(),括号内的重定向符号只影响命令,而括号外的重定向符号影响括号内的所有命令。