Bash-特殊字符-上
基础字符
#
注释,用于一行行首(#!
除外)或本行空白的后边。
;
命令分隔符,可以在一行中写多个命令。
;;
终止case选项。
.
等价于source命令,这是一个bash内建命令。
.
作为文件名的前缀时,则该文件为隐藏文件。作为目录名的一部分.
表示当前目录,..
表示上一级目录。用于字符匹配中,作为正则表达式的一部分,用来匹配任何单个字符。
“
部分引用,”STRING”阻止了一部分特殊字符。
'
全引用,’STRING’阻止了全部特殊字符。
,
逗号连接了一系列算术操作,虽然里面的内容都被运行了,当只有最后一项被返回。
\
转义字符
/
文件名路径分隔符,或用来作除法。
`后置引用,命令替换。
:
空命令,空操作,什么都不做
!
取反操作符。
*
万能匹配符,用于文件名匹配或正则表达式中。注意:*
在正则表达式匹配中与文件名匹配中是不同的。数学运算。**
幂运算。
?
测试操作,或在正则表达式中匹配任意单个字符。
$
变量替换,或在正则表达式中作为行结束符。
\$$
变量的间接引用。
^
正则表达式中表示行首。
${}
参数替换。
$*, $@
位置参数。
$?
退状态变量。
$$
进程ID变量,保存了运行脚本进程ID。
()
命令组。注意:在()中的命令列表将作为一个子shell来运行。
{xxx, yyy, ...}
大括号扩展。
{}
代码块,又称为内部组。事实上,这个结构创建了一个匿名函数,但是与函数不同的是,在其中声明的变量,对于脚本其它部分的代码来说还是可见的。
{}\;
路径名
[]
test
[[]]
test
[]
数组元素,或正则表达式中作为字符匹配的一个范围。
(())
算术扩展和赋值,以及允许C风格的变量处理机制。
> &> >> >&
重定向。
\<,\>
正则表达式中的单词边界。
|
管线。
>|
强制重定向。
+,-,*,/,**,%
算术操作符
||
逻辑或
&&
逻辑与
!
逻辑非
<<
左移一位
<<=n
左移n位
>>
右移一位
>>=n
右移n位
&
按位与
&=
按位与赋值
|
按位或
|=
按位或赋值
~
按位非
^, XOR
按位异或
^=
异或赋值
&
后台运行命令
注释
在 echo 中转义的
#
是不能作为注释的# 数制转换(使用二进制表示),不是一个注释,双括号表示对于数字的处理
分号(;)命令分隔符
使用分号
;
可以在同一行上写两个或两个以上的命令。
每个if语句都要用fi结束,而且是每一个if都要对应一个fi
双分号(;)终止 case 选项 和 点号(.)等价于 source 命令
使用双分号
;;
可以终止 case 选项。
source
命令用于在当前 bash 环境下读取并执行 FileName.sh 中的命令。
美元符号($)
通常情况下,在工作中用的最多的有如下几项:
$0:Shell 的命令本身
$1 到 $9:表示 Shell 的第几个参数
$#:传递到脚本的参数个数
$*:以一个单字符串显示所有向脚本传递的参数$@ 与$*相同。
$!:后台运行的最后一个进程的 ID 号
$$:脚本运行的当前进程 ID 号
$-:显示 Shell 使用的当前选项
$? :显示最后命令的执行情况,0表示没有错误。
…
单引号(')和双引号('')
同样是
$HOME
,单引号会直接认为是字符,而双引号认为是一个变量。双引号(")
"STRING" 将会阻止(解释)STRING 中大部分特殊的字符。
单引号(')
'STRING' 将会阻止 STRING 中所有特殊字符的解释,这是一种比使用"更强烈的形式。
斜线和反斜线
斜线(
/
)文件名路径分隔符。分隔文件名不同的部分(如
/home/bozo/projects/Makefile
)。也可以用来作为除法算术操作符。
注意在 linux 中表示路径的时候,许多个
/
跟一个/
是一样的。/home/shiyanlou
等同于////home///shiyanlou
。反斜线(
\
)一种对单字符的引用机制。
\X
将会“转义”字符 X。这等价于"X",也等价于'X'。
\
通常用来转义双引号("
)和单引号('
),这样双引号和单引号就不会被解释成特殊含义了。
- 符号 说明
\n
表示新的一行\r
表示回车\t
表示水平制表符\v
表示垂直制表符\b
表示后退符\a
表示"alert"(蜂鸣或者闪烁)\0xx
转换为八进制的 ASCII 码, 等价于 0xx\"
表示引号('')字面的意思转义符也提供 续行功能,也就是编写多行命令的功能。
每一个单独行都包含一个不同的命令,但是每行结尾的转义符都会转义换行符,这样下一行会与上一行一起形成一个命令序列。
反引号(`)
命令替换{
关于命令替换
}
反引号中的命令会优先执行,如:
cp `mkdir back` test.sh back ls
先创建了 back 目录,然后复制 test.sh 到 back 目录。
冒号(:)
空命令
等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与 shell 的内建命令 true 作用相同。“:”命令是一个 bash 的内建命令,它的退出码(exit status)是(0)。
比如下面两个是等价的:
在 if/then 中作占位符:
变量扩展/子串替换
与
>
重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。与
>>
重定向操作符结合使用时,将不会对预先存在的目标文件: >> target_file
产生任何影响。如果这个文件之前并不存在,那么就创建它。可能用来作为注释行,但不推荐这么做。使用 # 来注释的话,将关闭剩余行的错误检查,所以可以在注释行中写任何东西。然而,使用 : 的话将不会这样。
:
还用来在/etc/passwd
和$PATH
变量中做分隔符,如:
问号(?)
测试操作符
在一个双括号结构中,
?
就是 C 语言的三元操作符,如:
小括号(())
命令组
在括号中的命令列表,将会作为一个子 shell 来运行。
在括号中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的。父进程,也就是脚本本身,将不能够读取在子进程中创建的变量,也就是在子 shell 中创建的变量。(全体变量跟局部变量的区别)如:
初始化数组
大括号用来表示数组 如:
大括号({})
文件名扩展 或 数组表示
注意: 在大括号中,不允许有空白,除非这个空白被引用或转义。复制 t.txt 的内容到 t.back 中,如:
代码块(未命名函数)
代码块,又被称为内部组,这个结构事实上创建了一个匿名函数(一个没有名字的函数)。然而,与“标准”函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的。
中括号([ ])
条件测试
条件测试表达式放在
[ ]
中。双中括号([[ ]]
)也用作条件测试(判断)。if常见条件表达式和逻辑表达式
if [ -f file ] 如果文件存在
if [ -d ... ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ] 如果不存在目录$num
逻辑与 –a 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
逻辑或 -o 条件表达式的或
if [ 表达式1 –o 表达式2 ]
-lt
(less than)表示小于号,比如:
数组元素
在一个 array 结构的上下文中,中括号用来引用数组中每个元素的编号,大括号使得中括号引用有效。