Bash中的特殊字符⼤全【转】
Linux下⽆论如何都是要⽤到shell命令的,在Shell的实际使⽤中,有编程经验的很容易上⼿,但稍微有难度的是shell⾥⾯的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够⽤的好,往往能给我们起到事半功倍的效果,为此,特地将Shell⾥⾯的⼀些符号说明罗列成对照表的形式,以便快速的查。看看你知道下表中的哪些Shell符号呢?
Shell符号及各种解释对照如下:
特殊符号(#)
注释符号(Hashmark[Comments])
1.在shell⽂件的⾏⾸,作为shebang标记,#!/bin/bash;
2. 其他地⽅作为注释使⽤,在⼀⾏中,#后⾯的内容并不会被执⾏,除⾮;
3. 但是⽤单/双引号包围时,#作为#号字符本⾝,不具有注释作⽤。
特殊符号(;)
作为多语句的分隔符(Command separator [semicolon])。
多个语句要放在同⼀⾏的时候,可以使⽤分号分隔。注意,有时候分号需要转义。
特殊符号(;;)
连续分号(Terminator [double semicolon])。
在使⽤case选项的时候,作为每个选项的终结符。在Bash version 4+ 的时候,还可以使⽤[;;&], [;&]
特殊符号(.)
点号(dot command [period])。
1. 相当于bash内建命令source,如:
#!/bin/bash
. data-file
#包含data-file;
2. 作为⽂件名的⼀部分,在⽂件名的开头,表⽰该⽂件为隐藏⽂件,ls⼀般不显⽰出来(ls -a 可以显⽰);
3. 作为⽬录名,⼀个点代表当前⽬录,两个点号代表上层⽬录(当前⽬录的⽗⽬录)。注意,两个以上的点不出现,除⾮你⽤引号(单/双)包围作为点号字符本⾝;
4. 正则表达式中,点号表⽰任意⼀个字符。
特殊符号(")
双引号(partial quoting [double quote])。
部分引⽤。双引号包围的内容可以允许变量扩展,也允许转义字符的存在。如果字符串内出现双引号本⾝,需要转义,因此不⼀定双引号是成对的。\
特殊符号(')
单引号(full quoting [single quote])。
单引号括住的内容,被视为单⼀字符串,引号内的禁⽌变量扩展,所有字符均作为字符本⾝处理(除单引号本⾝之外),单引号必须成对出现。
特殊符号(,)
逗号(comma operator [comma])。
1. ⽤在连接⼀连串的数学表达式中,这串数学表达式均被求值,但只有最后⼀个求值结果被返回。如:
#!/bin/bash
let t1=((a=5+1, b=7+2))
echo t1=$t1, a=$a, b=$b
## 这个$t1=$b;
2. ⽤于参数替代中,表⽰⾸字母⼩写,如果是两个逗号,则表⽰全部⼩写,注意,这个特性在bash version 4的时候被添加的。例⼦:
a="ATest"
echo ${a,}
echo ${a,,}
## 前⾯输出aTest,后⾯输出的是atest。
特殊符号(\)
反斜线,反斜杆(escape [backslash])。
1. 放在特殊符号之前,转义特殊符号的作⽤,仅表⽰特殊符号本⾝,这在字符串中常⽤;
2. 放在⼀⾏指令的最末端,表⽰紧接着的回车⽆效(其实也就是转义了Enter),后继新⾏的输⼊仍然作为当前指令的⼀部分。
特殊符号(/)
斜线,斜杆(Filename path separator [forward slash])。
1.作为路径的分隔符,路径中仅有⼀个斜杆表⽰根⽬录,以斜杆开头的路径表⽰从根⽬录开始的路径;
2.在作为运算符的时候,表⽰除法符号。如:a=4/2
特殊符号(`)
反引号,后引号(Command substitution[backquotes])。
命令替换。这个引号包围的为命令,可以执⾏包围的命令,并将执⾏的结果赋值给变量。如:a=`dirname '/tmp/x.log'`。
后⾯dirname返回的结果会赋值给a,注意,此处Mitchell特地使⽤了反引号和单引号,注意区别。
特殊符号(:)
冒号(null command [colon])。
空命令,这个命令什么都不做,但是有返回值,返回值为0(即:true)。这个命令的作⽤⾮常奇妙。
1. 可做while死循环的条件;
2. 在if分⽀中作为占位符(即某⼀分⽀什么都不做的时候);
3. 放在必须要有两元操作的地⽅作为分隔符,如:: ${username=`whoami`}
4. 在参数替换中为字符串变量赋值,在重定向操作(>)中,把⼀个⽂件长度截断为0(:>>这样⽤的时候,⽬标存在则什么都不做),这个只能在普通⽂件中使⽤,不能在管道,符号链接和其他特殊⽂件中使⽤;
5. 甚⾄你可以⽤来注释(#后的内容不会被检查,但:后的内容会被检查,如果有语句如果出现语法错误,则会报错);
6. 你也可以作为域分隔符,⽐如环境变量$PATH中,或者passwd中,都有冒号的作为域分隔符的存在;
7. 你也可以将冒号作为函数名,不过这个会将冒号的本来意义转变(如果你不⼩⼼作为函数名,你可以使⽤unset -f : 来取消function的定义)。
特殊符号(!)
感叹号(reverse (or negate) [bang],[exclamation mark])。
取反⼀个测试结果或退出状态。
1. 表⽰反逻辑,⽐如后⾯的!=,这个是表⽰不等于;
2. 表⽰取反,如:ls a[!0-9] #表⽰a后⾯不是紧接⼀个数字的⽂件;
3. 在不同的环境⾥⾯,感叹号也可以出现在间接变量引⽤⾥⾯;
4. 在命令⾏中,可以⽤于历史命令机制的调⽤,你可以试试!$,!#,或者!-3看看,不过要注意,这点特性不能在脚本⽂件⾥⾯使⽤(被禁⽤)。
星号(wildcard/arithmetic operator[asterisk])。
1. 作为匹配⽂件名扩展的⼀个通配符,能⾃动匹配给定⽬录下的每⼀个⽂件;
2. 正则表达式中可以作为字符限定符,表⽰其前⾯的匹配规则匹配任意次;
3. 算术运算中表⽰乘法。
特殊符号(**)
双星号(double asterisk)。算术运算中表⽰求幂运算。
特殊符号(?)
问号(test operator/wildcard[Question mark])。
1. 表⽰条件测试;
2. 在双括号内表⽰C风格的三元操作符((condition?true-result:false-result));
3. 参数替换表达式中⽤来测试⼀个变量是否设置了值;
4. 作为通配符,⽤于匹配⽂件名扩展特性中,⽤于匹配单个字符;
5. 正则表达式中,表⽰匹配其前⾯规则0次或者1次。
特殊符号($)
美元符号(Variable substitution[Dollar sign])。
1. 作为变量的前导符,⽤作变量替换,即引⽤⼀个变量的内容,⽐如:echo $PATH;
2. 在正则表达式中被定义为⾏末(End of line)。
特殊符号(${})
参数替换(Variable substitution)。
⽤于在字符串中表⽰变量。
特殊符号($‘...’)
引⽤内容展开,执⾏单引号内的转义内容(单引号原本是原样引⽤的),这种⽅式会将引号内的⼀个或者多个[\]转义后的⼋进制,⼗六进制值展开到ASCII或Unicode字符。
特殊符号($*或$@)
位置参数(Positional Parameters)。
这个在使⽤脚本⽂件的时候,在传递参数的时候会⽤到。两者都能返回调⽤脚本⽂件的所有参数,但$*是将所有参数作为⼀个整体返回(字符串),⽽$@是将每个参数作为单元返回⼀个参数列表。注意,在使⽤的时候需要⽤双引号将$*,$@括住。这两个变量受到$IFS的影响,如果在实际应⽤中,要考虑其中的⼀些细节。
特殊符号($#)
表⽰传递给脚本的参数数量。
特殊符号($?)
此变量值在使⽤的时候,返回的是最后⼀个命令、函数、或脚本的退出状态码值,如果没有错误则是0,如果为⾮0,则表⽰在此之前的最后⼀次执⾏有错误。
特殊符号($$)
进程ID变量,这个变量保存了运⾏当前脚本的进程ID值。
圆括号(parentheses)。
1,命令组(Command group)。由⼀组圆括号括起来的命令是命令组,命令组中的命令实在⼦shell(subshell)中执⾏。
因为是在⼦shell 内运⾏,因此在括号外⾯是没有办法获取括号内变量的值,但反过来,命令组内是可以获取到外⾯的值,这点有点像局部变量和全局变量的关系,在实作中,如果碰到要cd到⼦⽬录操作,并在操作完成后要返回到当前⽬录的时候,可以考虑使⽤subshell来处理;
2. ⽤于数组的初始化。
特殊符号({x,y,z,...})
花括号扩展(Brace Expansion)。
在命令中可以⽤这种扩展来扩展参数列表,命令将会依照列表中的括号分隔开的模式进⾏匹配扩展。注意的⼀点是,这花括号扩展中不能有空格存在,如果确实有必要空格,则必须被转义或者使⽤引号来引⽤。例⼦: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这类临时⽂件,⽤来传递数据。
Mitchell个⼈猜测之所以⽤这种⽅法来传递,是因为前后两个不属于同⼀个进程,因此需要⽤共享⽂件的⽅式来传递资料(这么说其实管道也应该有同样的⽂件?)。⽹上有⼈说这个只是共享⽂件⽽已,但是经过测试,发现虽然有/dev/fd/63这样的⽂件产⽣,但是这个⽂件其实是指向pipe:[43434]这样的通道的链接。
特殊符号(<<)
双⼩于号(here-document[double less then marks])。
这个也被称为Here-document,⽤来将后继的内容重定向到左侧命令的stdin中。<<;可以节省格式化时间,别且使命令执⾏的处理更容易。在实作的时候只需要输⼊<<;和终⽌标志符,⽽后(⼀般是回车后)你就可以输⼊任何内容,只要在最后的新⾏中输⼊终⽌标志符,即可完成数据的导⼊。使⽤here-document的时候,你可以保留空格,换⾏等。如果要让shell脚本更整洁⼀点,可以在<<;和终⽌符之间放上⼀个连字符(-)。
特殊符号(<<<)
三个⼩于号(here-strings)。Here-字串和Here-document类似,here-strings语法:command [args] <<<["]$word["];$word会展开并作为command 的stdin。
特殊符号(>, <)
⼩于,⼤于号(ASCII Comparison)。
ASCII⽐较,进⾏的是变量的ASCII⽐较,字串?数字?呃...这个...不就是ASCII⽐较么?
特殊符号(\<...\>)
词界符(word boundary)。
这个是⽤在正则表达式中的⼀个特殊分隔符,⽤来标记单词的分界。⽐如:the会匹配there,another,them等等,如果仅仅要匹配the,就可以使⽤这个词界符,\<the\>就只能匹配the了。
特殊符号(|)
管道(pipe)。管道是Linux,Unix都有的概念,是⾮常基础,也是⾮常重要的⼀个概念。它的作⽤是将管道前(左边)的命令产⽣的输出(stdout)作为管道后(右边)的命令的输⼊(stdin)。如:ls | wc l,使⽤管道就可以将命令连接在⼀起。注意:管道是每⼀个进程的标准输出都会作为下⼀个命令的标准输⼊,期间的标准输出不能跨越管道作为后继命令的标准输⼊,如:cat filename | ls -al | sort。想想这个的输出? 同时,管道是以⼦进程来运⾏的,所以管道并不能引起变量改变。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论