文件头里的括号怎么打 键盘中括号 [ ]怎么打出来


一、小括号与圆括号(())

1. 单小括号(())

1)命令组:小括号内的命令会在一个新的子shell中依次执行,括号内定义的变量无法在外部脚本中使用。命令之间通过分号分隔,最后一个命令后可以省略分号,且命令与括号之间不需要空格。

2)命令替换:类似于反引号(cmd)的功能,$(cmd)结构允许Shell先执行括号中的命令,获取其输出结果,并将此输出替换原本的位置。需要注意的是,某些Shell(如tcsh)不支持这种替换形式。

3)数组初始化:在Shell脚本中,使用括号来初始化数组,形式为array=(abcd)。

2. 双小括号((()))

1)整数运算:双小括号用来执行整数类型的算术运算。它不支持浮点数计算。表达式中的值为0时,返回的退出状态码为1(即"假");若为非零值,则返回0(即"真")。若用于逻辑判断时,exp为真时返回1,为假时返回0。

2)支持多种运算符:与C语言相似的运算符可以在$((exp))中使用,包括三目运算符。在不同进制之间进行转换时,Shell会自动将结果转换为十进制。例如,echo $((165f))会输出95(将16进制转为10进制)。

3)变量重定义:除了进行算术运算,双小括号还可以直接用来修改变量值。例如,a=5; ((a++))会将a的值修改为6。

4)用于逻辑判断和循环控制:在进行算术运算比较时,可以直接使用变量而不必加上$符号。多个表达式之间可以使用逗号分隔。比如for ((i=0; i<5; i++)),不需要使用seq命令来生成序列,简化了代码。if (($i < 5))也可以代替传统的if [ $i -lt 5 ]形式。

二、中括号与方括号([])

1. 单中括号([])

1)Bash中的test命令:在Bash中,[和test是等效的。if语句或test命令中,左中括号表示调用test,右中括号则标志条件判断的结束。test命令根据其参数返回一个退出状态码,表示条件是否成立。在较新的Bash版本中,右括号已成为必需的语法。

2)字符串和整数比较:test命令支持的字符串比较运算符为==(等于)和!=(不等于),但这两个符号不能用于整数比较。对于整数,必须使用-eq、-gt等形式。需要注意的是,[]中并不支持使用大于号(>)和小于号(<)进行直接比较,若要使用这些符号,必须进行转义操作。例如,[ ab\等运算符能够正常使用,且不会产生错误,而在[ ... ]中这些运算符会导致语法错误。比如,if [[ $a != 1 && $a != 2 ]]与if [ $a -ne 1 ] && [ $a -ne 2 ]具有相同效果,但前者更简洁。

4)返回退出状态码:在[[ ... ]]内,整个条件表达式被视作一个单一元素,Shell会根据表达式的真假返回相应的退出状态码。

三、大括号与花括号({})

1. 常规用法

1)大括号扩展:大括号内的内容可用于通配符扩展。扩展时大括号内不能包含空格,除非空格经过转义或引用。扩展形式有两种:

以逗号分隔的文件列表:例如,touch {a,b}.txt会生成a.txt和b.txt。

以范围表示的文件列表:例如,touch {a..d}.txt会生成a.txt、b.txt、c.txt和d.txt。

2)命令组:大括号也用来表示一个命令组(或代码块),这与小括号不同,命令组不会创建新的子shell,因此大括号内的变量可以在外部继续使用。每条命令之间需要使用分号分隔,最后一条命令后也必须加分号。大括号前后的命令必须以空格分隔。

2. 特殊替换结构

1)默认值替换:${var:-string}和${var:=string}用于在var为空时用string替换。在${var:=string}中,若var为空,不仅会返回string,还会将string赋值给var。

2)替代值:${var:+string}仅在var不为空时返回string,否则不做任何替换。

3)空值检查:${var:?string}在var为空时会输出string并终止脚本。如果var不为空,则返回var的值。

四、模式匹配替换结构

1)最小匹配:${variable%pattern}表示去掉variable中与pattern最短匹配的部分。

2)最长匹配:${variable%%pattern}表示去掉variable中与pattern最长匹配的部分。

3)左边匹配:${variablepattern}表示去掉variable中与pattern最短匹配的部分(从左边开始)。

4)最长左边匹配:${variablepattern}表示去掉variable中与pattern最长匹配的部分(从左边开始)。

这些替换规则可以通过使用、?和[]等通配符来进一步优化匹配模式。

五、字符串提取与替换

1)提取字符:${var:num}用于从字符串中提取从num位置到末尾的字符。如果num为负数,则从右边开始提取。

2)提取子串:${var:num1:num2}从var字符串的第num1个字符开始,提取长度为num2的子串。

3)替换第一个匹配项:${var/pattern/pattern}将var中第一个匹配pattern的部分替换为新的pattern。

4)替换所有匹配项:${var//pattern/pattern}将var中所有匹配pattern的部分替换为新的pattern。