Bash 中的特殊字符大全【转】

Linux下不管如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各类特殊的符号在咱们编写Shell脚本的时候若是可以用的好,每每能给咱们起到事半功倍的效果,为此,特意将Shell里面的一些符号说明罗列成对照表的形式,以便快速的查找。看看你知道下表中的哪些Shell符号呢?html

Shell符号及各类解释对照以下:linux

特殊符号(#)

注释符号(Hashmark[Comments])正则表达式

1.在shell文件的行首,做为shebang标记,#!/bin/bash;shell

2. 其余地方做为注释使用,在一行中,#后面的内容并不会被执行,除非;编程

3. 可是用单/双引号包围时,#做为#号字符自己,不具备注释做用。数组

特殊符号(;)

做为多语句的分隔符(Command separator [semicolon])。bash

多个语句要放在同一行的时候,可使用分号分隔。注意,有时候分号须要转义。less

特殊符号(;;)

连续分号(Terminator [double semicolon])。curl

在使用case选项的时候,做为每一个选项的终结符。在Bash version 4+ 的时候,还可使用[;;&], [;&]ide

特殊符号(.)

点号(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 。想一想这个的输出? 同时,管道是以子进程来运行的,因此管道并不能引发变量改变。

特殊符号(>|)

强制重定向(force redirection)。

这会强制重写已经存在的文件。

特殊符号(&)

与号(Run job in background[ampersand])。

若是命令后面跟上一个&符号,这个命令将会在后台运行。有的时候,脚本中在一条在后台运行的命令可能会引发脚本挂起,等待输入,出现这种状况能够在原有的脚本后面使用wait命令来修复。

特殊符号(&&,||)

逻辑操做符(logical operator)。

在测试结构中,能够用这两个操做符来进行链接两个逻辑值。||是当测试条件有一个为真时返回0(真),全假为假;&&是当测试条件两个都为真时返回真(0),有假为假。

特殊符号(-)

减号,连字符(Hyphen/minus/dash)。

1. 做为选项,前缀[option, prefix]使用。用于命令或者过滤器的选项标志;操做符的前缀。如:

## COMMAND -[选项列表]
ls -al
sort -dfu $file
set -- $variable
 
if [ $file -ot $file2 ]
then
    echo "$file is older than $file2."
fi

2. 用于stdin或者stdout的重定向的源或目的[dash].在tar没有bunzip2的程序补丁时,咱们能够这样: bunzip2 linux-2.6.13.tar.bz2 | tar xvf - 。将前面解压的数据做为tar的标准输入(这里使用一个-表示)

注意:在实做的时候,若是文件名是以[-]开头的,那么在加上这个做为定向操做符的时候,可能会出错,此时应该为文件加上合适的前缀路径,以免这种状况发生,一样的,在echo变量的时候,若是变量是以[-]开始,那么可能也会产生意想不到的结果,为了保险起见,可使用双引号引用标量:

var="-n"
echo $var
## 试试看有什么输出?

还有,这种表示方法不是Bash内建的,要达到此点的这种效果,须要看你使用的软件是否支持这种操做;

3. 表示先前的工做目录(previous working directory),所以,若是你cd到其余目录下要放回前一个路径的时候,可使用cd -来达到目的,其实,这里的[-]使用的是环境变量的$OLDPWD,注意:这里的[-]和前一点是不一样的;

4. 减号或者负号,用在算术操做中。

特殊符号(=)

等号(Equals)。

1. 赋值操做,给变量赋值,么有空格在等号两侧;

2. 在比较测试中做为比较符出现,这里要注意,若是在中括号中做为比较出现,须要有空格符在等号左右两侧。

特殊符号(+)

加号(Plus)。

1. 算术操做符,表示加法;

2. 在正则表达式中,表示的是其前的这个匹配规则匹配最少一次;

3.在命令或过滤器中做为选项标记,在某些命令或者内置命令中使用+来启用某些选项,使用-来禁止;

4. 在参数替换(parameter substitution)中,+前缀表示替代值(当变量为空的时候,使用+后面的值)

特殊符号(%)

百分号(modulo[percent sign])。

1.在算术运算中,这个是求模操做符,即两个数进行除法运算后的余数;

2. 在参数替换(parameter substitution)中,能够做为模式匹配。例子:

p=b*9
var="abcd12345abc479"
echo ${var%p}, ${var%%p}
##从右边开始查找(想一想从左是那个符号?)
##任何在b和9之间的内容(含)
##第一个是找到最短的符合匹配项
##后一个是找最大符合的匹配项(贪婪匹配?)

特殊符号(~)

波浪号(Home directory[tilde])。

这个和内部变量$HOME是同样的。默认表示当前用户的家目录(主目录),这个和~/效果一致,若是波浪号后面跟用户名,表示是该用户的家目录。

特殊符号(~+)

当前的工做目录(current working directory)。

这个和内置变量$PWD同样。

特殊符号(~-)

前一个工做目录(previous working directory)。

这个和内部变量$OLDPWD一致,以前的[-]也同样。

特殊符号(=~)

Bash 版本3中有介绍,这个是正则表达式匹配。可用在[[]]测试中,好比:

var="this is a test message."
[[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
##你能够修改中间的正则表达式匹配项,正则表达式能够但不必定须要使用双引号括起来。

特殊符号(^)

脱字符(caret)。

1. 在正则表达式中,做为一行的行首(beginning-of-line)位置标志符;

2. 在参数替换(Parameter substitution)中,这个用法有两种,一个脱字符(${var^}),或两个(${var^^}),分别表示第一个字母大写,所有大写的意思(Bash version >=4)。

特殊符号(空白)

空白符(Whitespace)。

空白符不只仅是指空格(spaces),还包括制表符(tabs),空行(blank lines),或者这几种的组合。可用作函数的分隔符,分隔命令或变量,空行不会影响脚本的行为,所以能够用它来规划脚本代码,以增长可读性,在内置的特殊变量$IFS能够用来针对某些命令进行输入的参数进行分割,其默认就是空白符。在字符串或变量中若是有空白符,可使用引号来规避可能的错误。

 

怎样,你有多少是了解的呢?Mitchell在开始的Shell脚本时候,发如今这里面有好多都是不认识呢。

说明:由于涉及到翻译,文中内容不必定彻底翻译准确,若是你发现有错误的地方,还请包涵指正。

参考:

  1. 本文主要内容来源:Advanced Bash-Scripting Guide
  2. 对话 UNIX: !$#@*%
  3. wikipedia的Here文档

转自:https://linux.cn/article-5657-1.html

相关文章
相关标签/搜索