在命令中可以用这种扩展来扩展参数列表,命令将会依照列表中的括号分隔开的模式进行匹配扩展。注意的一点是,这花括号扩展中不能有空格存在,如果确实有必要空格,则必须被转义或者使用引号来引用。例子:echo {a,b,c}-{\ d," e",' f'}
{a..z}
在Bash version 3时添加了这种花括号扩展的扩展,可以使用{A..Z}表示A-Z的所有字符列表,这种方式的扩展Mitchell测试了一下,好像仅适用于A-Z,a-z,还有数字{最小..最大}的这种方式扩展。
{}
代码块(curly brackets)。
这个是匿名函数,但是又与函数不同,在代码块里面的变量在代码块后面仍能访问。注意:花括号内侧需要有空格与语句分隔。另外,在xargs -i中的话,还可以作为文本的占位符,用以标记输出文本的位置。
{} \;
这个{}是表示路径名,这个并不是shell内建的,现在接触到的情况看,好像只用在find命令里。注意后面的分号,这个是结束find命令中-exec选项的命令序列,在实际使用的时候,要转义一下以免被shell理解错误。
[]
中括号(brackets)。
1. 测试的表示,Shell会测试在[]内的表达式,需要注意的是,[]是Shell内建的测试的一部分,而非使用外部命令/usr/bin/test的链接;
2. 在数组的上下文中,表示数组元素,方括号内填上数组元素的位置就能获得对应位置的内容,如:
Array[1]=xxx
echo ${Array[1]};
3. 表示字符集的范围,在正表达式中,方括号表示该位置可以匹配的字符集范围。
[[]]
双中括号(double brackets)。
这个结构也是测试,测试[[]]之中的表达式(Shell的关键字)。这个比单中括号更能防止脚本里面的逻辑错误,比如:&&,||,<,>操作符能在一个[[]]里面测试通过,但是在[]却不能通过。[[]]里面没有文件名扩展(filename expansion)或是词分隔符(Word splitting),但是可以用参数扩展(Parameter expansion)和命令替换(command substitution)。不用文件名通配符和像空白这样的分隔符。注意,这里面如果出现了八进制,十六进制等,shell会自动执行转换比较。
$[...]
词表达表示整数扩展(integer expansion)。
在方括号里面执行整数表达式。例:
a=3
b=7
echo $[$a+$b]
echo $[$a*$b]
##返回是10和21
(())
双括号(double parentheses)。
表示整数扩展(integer expansion)。功能和上面的$[]差不多,但是需要注意的是,$[]是会返回里面表达式的值的,而(())只是执行,并不会返回值。两者执行后如果变量值发生变化,都会影响到后继代码的运行。可对变量赋值,可以对变量进行一目操作符操作,也可以是二目,三目操作符。
>
&<
>&
>>
<
<>
重定向(redirection)。
scriptname >filename 重定向scriptname的输出到文件filename中去,如果文件存在则覆盖;
command &>filename 重定向command的标准输出(stdout)和标准错误(stderr)到文件filename中;
command >&2 把command的标准输出(stdout)重定向到标准错误(stderr)中;
scriptname >>filename 把scriptname的输出(同>)追加到文件filenmae中,如果文件不存在则创建。
[i]<>filename 打开filename这个文件用来读或者写,并且给文件指定i为它的文件描述符(file descriptor),文件不存在就会创建。
(command)>
<(command)
这是进程替换(Process Substitution)。
使用的时候注意,括号和<,>之间是不能有空格的,否则报错。其作用有点类似通道,但和管道在用法上又有些不同,管道是作为子进程的方式来运行的,这个命令会在/dev/fd/下面产生类似/dev/fd/63,/dev/fd/62这类临时文件,用来传递数据。