全部博文(124)
分类: LINUX
2010-05-27 22:25:28
在脚本或其他别的地方出现的特殊字符
注释. 以一个#开头的行 () 是注释行.
1 # 这是一行注释. |
注释也可以出现在一个命令语句的后面。
1 echo "A comment will follow." # 这里可以添加注释. |
注释行前面也可以有.
1 #注意这个注释行的开头是一个TAB键. |
在同一行中,命令不会跟在一个注释的后面。因为这种情 况下没有办法分辨注释的结尾,命令只能放在同一行的行首。用另外的一个新行开始下一个注释。 |
当然了,在echo命令给出的一个转义的#字符并不会 开始一个注释。同样地,出现在和在中的#字符也同样不会开始一个注释。
|
当然,也可以使用#,而不必把它当做注释的开始。
命令分割符[分号]. 分割符允许在同一行里有两个或更多的命令.
1 echo hello; echo there |
注意”;”有时需要.
语 句分支的结束符[双分号].
1 case "$variable" in |
"点"命令[圆点]. 等同于 (参考).这是一个bash的命令.
"点", 作为一个文件名的组成部分.当点(.)以一 个文件名为前缀时,起作用使该文件变成了隐藏文件。这种隐藏文件一 般是不会显示出来的。[译者注:除非你加了选项-a]
bash$ touch .hidden-file |
作为目录名时,单个点(.)表示当前目录,两个点(..)表示上一级目录(译者注:或称为父目录)。
bash$ pwd |
单点(.)文件名常常被当作文件移动命令的目的路径.
bash$ cp /home/bozo/current_work/junk/* . |
点(.)字符匹配.作为的一部分,时,单点(.)表示匹配任意一个字符。
[双引号]. "STRING"的引用会使STRING里的特殊字符能 够被解释。请参考.
[单引号]. 'STRING'能引用STRING里的所有字符(包括特殊字符 也会被原样引用). 这是一个比使用双引号(“)更强的引用。 参考.
[逗号]. 逗号操作符用于连接一连串的数学表达式。这一串的数学表达式每一个 都被求值,但只有最后一个被返回。(译者注:换句话说,就是整个表达式的值取决于最后一个表达式的值。)
1 let "t2 = ((a = 9, 15 / 3))" # Set "a = 9" and "t2 = 15 / 3" |
[后斜杠].用于单个字符的引用机制。
\X "转义"字 符为X.它有"引用"X的作用,也等同于直接在单引号里的'X'.\符也可以用 于引用双引号(")和单引号('),这时双引号和单引号就表示普通的字符,而不是表示引用了。
参考对 转义字符的更深入的解释。
文件路径的分隔符[前斜杠]. 分隔一个文件路径的各个部分。(就像/home/bozo/projects/Makefile).
它也是中的除法.
.`command` 结构使字符(`)[译者注:这个字符不是单引号,而是在标准美国键盘上的ESC键下面,在字符1左边,在TAB键上面的那个键,要特别留心]引住的命令(command)执行结果能赋值给一个变量。它也被称为后引号() 或是斜引号(backticks).
空命令[冒号]. 这个命令意思是空操作(即什么操作 也不做). 它一般被认为是和shell的内建命令是 一样的。冒号":" 命令是Bash自身的, and its它的是真(即0)。[译者注:shell中真用数字0表示].
1 : |
死循环可以这么写:
1 while : |
在if/then的测试结构中用作占位符:
1 if condition |
在必须要有两元操作的地方作为一个分隔符, 参考和.
1 : ${username=`whoami`} |
在here document中的一个命令作为一个分隔符. 参考.
在中为字符串变量赋值 (就像).
1 : ${HOSTNAME?} ${USER?} ${MAIL?} |
.
和(>)连用, 可以把一个文件的长度截短为零,文件的权限不变。如果文件不存在,则会创建一个新文件。
1 : > data.xxx # 文件"data.xxx"现在长度为0了 |
和添加重定向操作符(>>)连用(: >> target_file).如果目标文件存在则什么也没有发生,如 果目标文件不存在,则创建它。
这只能应用在普通文件中,不能用在管道,符号链接和其 他的特殊文件。 |
虽然这是不被推荐的,但是NULL操作符(:)也可以用于开始注释一行。使用#来注释一行将会使Bash不会检查这行后面的语法是 否有错,因此#注释几乎可以出现任何的东西。但是,对于用NULL操作符(:)注释的行则不是这样。
下面一个会产生错误的注释。
1 : This is a comment that generates an error, ( if [ $x -eq 3] ). |
字符”:”也用于域分割符。比如说在/etc/passwd和环境变量里.
bash$ echo $PATH |
取反一个测试结果或退出状态[感叹号]. 取反操作符(!)取反一个命令的(参考).它也取反一个测试操作。例如,它能改相等符( )为不等符( != ).取反操作符(!)是一个Bash的.
在不同的环境里,感叹号也可以出现在.
还有一种环境里,在命令行中,感叹号(!)调用属于历史命令机制的调用(详细请 看).值得一提的是,在一个脚本里,命令历史机制是被禁止的。
通配符[星号].星号(*)字符在用于文件名扩展的一个通配符.它自动匹配给定的目录下的每一个文件。
bash$ echo * |
星号(*)也用于中匹配任意数字字符。.
. 在计算时,星号(*)表示乘法运算符。两个星号(**)表示。
测试操作符.在一些表达式中,问号(?)表示一个条件测试.
在里,问号(?)表示C风格的三元操作符.请参考.
在表达式里,问号(?).
通配符. 字符?被用于文件名扩展特性的文件名表达式的单字符,同时也在中匹配.
(引用一个变量的内容).
1 var1=5 |
一个变量名前面加一个$字符前缀表示引用该变量的内容。
行的结尾. 在里,一个$字符表示匹配一行的结尾。
.
.
保存退出码值的变量. 保存了一个命令,一个,或一个脚本的的值。
进程ID变量. 保存了脚本运行时的进程ID值。
命令组.
1 (a=hello; echo $a) |
一组由圆括号括起来的命令是新开一个来 执行的. 因为是在子shell里执行,在圆括号里的变量不能被脚本的其他部分访问。因为。(译者注:读者若对这部分内容感兴趣,可以参考stevens
的< |
数组初始化.
1 Array=(element1 element2 element3) |
扩展支持.
1 cat {file1,file2,file3} > combined_file |
一个命令可以在文件名扩展中从逗号分隔的各模式来扩展参数列表。 文件名将会依照列表中逗号分隔开的模式扩展。
在扩展中的所有模式都不能包含空白字符,除非空白字符 是被转义或引用的。 echo {file1,file2}\ :{\ A," B",' C'} file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C |
代码块[花括号]. 这个结构也是一组命令代码块,事实上,它是匿名的函数。然而与一个所不同的,在代码块里的变量仍然能被脚本后面的代码访问。
bash$ { local a; |
1 a=123 |
由花括号括起的代码块可以引起输入输出的。
例子 3-1. 代码块与I/O重定向
1 #!/bin/bash |
例子 3-2. 把一个代码块的结果写进一个文件
1 #!/bin/bash |
不像一个用圆括号括起来的命令组,一个用花括号括起的 代码块不会以一个运 行。 |
路径名. 基本上用于命 令里.它不是shell的.
分号";"结束find命令中-exec选项的命令序列.它应该转义一下以免被shell误解释。 |
测试.
在[ ]中的表达式. 注意[是shell内建的测试的 一部分(同义于测试),并非 是外部命令/usr/bin/test的 链接.
测试.
测试[[ ]]之中的表达式(shell的).
参考的讨论.
数组元素.
在的上下文中,方括号表示数组的每个元素的数字编号.
1 Array[1]=slot_1 |
字符集的范围.
用于的一部分,方括号描述一个匹配的.
整数扩展.
扩展并计算(( ))里的整数表达式[译者注:粗心的读者要注意了,是整 数计算,可不能用来做浮点计算].
参考的讨论.
.
scriptname >filename重定向scriptname的输出到文件filename中 去. 如果文件filename存在则将会被覆盖.
command &>filename 会重定向命令command标准输出(stdout)和 标准错误(stderr)到文件filename中.
command >&2 把命令command的标准输出(stdout)重定向到 标准错误(stderr).
scriptname >>filename appends把脚本scriptname的输出追加到文件filename.如果filename不存在,则 它会被创建.
.
(command)>
<(command)
, 字符 "<"和">"会被当作.
, 字符"<"和">"被当作. 请参考.
在here document中使用的重定向.
在 中使用的重定向.
.
1 veg1=carrots |
在 中的.
bash$ grep
'\
管道. 把上一个命令的输出传给下一个命令,或是shell. 这是连接命令的一种方法.
1 echo ls -l | sh |
经典的进程间通信方法之一的管道能把一个进程的标准输出发到另一个进程的标准输入.在一种典型的情况,一个命令, 比如说或, 管道传递一个数据流给过滤器(一个改变了它的输入的命令)。 cat $filename1 $filename2 | grep $search_word |
一个命令或一组命令的输出可以由管道传给一个脚本.
1 #!/bin/bash |
bash$ ls -l | ./uppercase.sh |
管道里的每一个进程的标准输出都被当成下一个命令的标 准输入. 如果不是这种情况,那么数据流会阻塞,并且管道不会引起预期的效果。
管道以来运行, 因此不能引起变量的改变。
如果在管道中的一个命令失败了,会过早的终结整个管道的执行。这称为管道破坏(broken pipe),这时会发送一个叫SIGPIPE 的. |
强迫重定向 (即使设置). 这会强迫覆盖一个存在的文件.
. 在一个中,||操作符当测试条件的任何一个为真时返回0 (成功)的标志.
在后台运行作业. 一个后面跟一个&的命令会 在后台运行.
bash$ sleep 10 & |
在一个脚本里,在后台运行的命令或是偶数的可以在后台运行.
例子 3-3. 在后台运行一个循环
1 #!/bin/bash |
脚本中在一条在后台运行的命令可能会引起脚本悬挂,等 待一个击键动作。幸运的是,有一个. |
. 在中,&&操作只在测试条件两者 都为真时会返回0(成功).
选项, 前缀. 用于一个命令或过滤器的选项标志.或用于一个操作符的前缀.
COMMAND -[选项1][选项2][...]
ls -al
sort -dfu $filename
set -- $variable
1 if [ $file1 -ot $file2 ] |
用于stdin或stdout重 定向的源或目的[dash].
1 (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -) |
1 bunzip2 linux-2.6.13.tar.bz2 | tar xvf - |
注意"-"环境不是一个Bash操作符提供的,而是被由一些写标准输出的 UNIX软件包来验证的,比如tar, cat,等等.
bash$ echo "whatever" | cat - |
当希望提供一个文件名时, '-' 重定向输出到标准输出(有时像tar cf),或者从标准输入接受输入,就好像它 们是一个文件一样 . 这是在管道中使用文件导向(file-oriented)软件包作为一个过滤器的方法.
bash$ file |
加一个"-"来看看结果,这会使shell等候用户的输入。
bash$ file - |
"-"能被用来把标准输出由管道输出到其他的命令.这样就允许使用的技巧.
使用 来比较一个文件和另一个文件的某一段:
grep Linux file1 | diff file2 -
最后Finally,再展示一个使用- 的命 令的真实例子.
例子 3-4. 备份前24小时被修改的文件
1 #!/bin/bash |
以"-"字 符开头为文件名的文件当加上"-"的定向操作符时可能会引起问题.脚本应该检查这种情况并且给这 种文件增加合适的路径前缀,例如 ./-FILENAME, $PWD/-FILENAME, 或$PATHNAME/-FILENAME. 如果一个变量的值以-开头,同样也可能会产生问题.
|
先前的工作目录. 命令cd - 可以回到原来的工作目录.它使用了 .
不要弄混了这儿使用的"-"和上面刚讨论的"-"重定向操作符.对于"-"字符的解释应依赖于它出现的环境. |
负号或减号. 减号用于.
等号.
1 a=28 |
在, "="是一个操作符.
加. 加法.
在中, +是一个操作符.
选项. 一个命令或是过滤器的选项标志.
一些命令和 用+来启用一些选项,用-来禁用它们.
. 取模 (一次除法的余数) .
在中,%是一个 操作符.
主目录或称为家目录[波浪号]. 它与内部变量 是一致的. ~bozo是bozo'的主目录,而ls ~bozo 会列出此目录的内容. ~/ 是当前用户的主目录,并且ls ~/ 会列出此目录的内容.
bash$ echo ~bozo |
当前工作目录. 它与外部变量是 一致的.
先前的工作目录. 它与外部变量是 一致的.
. 这个操作符由bash 引入.
行首.在, 字符"^"表达匹配一个文本行的开头.
更改终端行为或文本显示. 控制字符都是以CONTROL + key的组合键.
在脚本文件中控制字符是不起作用的.
Ctl-B
退格 (非破坏性的).
Ctl-C
中断. 终结一个前台作业.
Ctl-D
从一个shell中退出 (类似于).
"EOF" (文件结尾:end of file).它也用于表示标准输入(stdin)的结束.
在控制台或xterm 窗口输入文本时, Ctl-D删除在光标下的字符.如果没有字符存在,Ctl-D 则会登录出该会话. 在一个xterm窗口中,则会产生关闭此窗口的效果。
Ctl-G
"哔" (beep).在一些老式的打字机终端上,它会响一下铃.
Ctl-H
"杀掉" (破坏性的退格). 删除光标前的一个字符===.
1 #!/bin/bash |
Ctl-I
水平制表符.
Ctl-J
新行(换一行并到行首).
Ctl-K
垂直制表符.
在控制台或xterm 窗口输入文本时, Ctl-K 会删除从光标所在处到行尾的所有字符。
Ctl-L
清屏 (重绘屏幕,清除前面的打印信息).这与命 令作用相同.
Ctl-M
回车.
1 #!/bin/bash |
Ctl-Q
解冻 (XON).
它解冻终端的标准输入.
Ctl-S
挂起输入 (XOFF).
它冻结终端的标准输入. (用 Ctl-Q 可恢复输入.)
Ctl-U
删除从光标到行首的一行输入.在某些设置里,Ctl-U 删除整行的输入,而不管光标的位置.
Ctl-V
当输入一个文本, Ctl-V允许插入控制字符。 例如,下面两个命令是相等的:
1 echo -e '\x0a' |
Ctl-V 主要用于文本编辑.
Ctl-W
当在控制台或一个xterm窗口敲入文本时, Ctl-W 会删除从在光标处往后的第一个空白符之间的内容.在某些设置里, Ctl-W 删除光标往后到第一个非文字和数字之间的字符.
Ctl-Z
暂停一个前台作业.
用做函数的分隔符,分隔命令或变量. 空白是由空格 (spaces),制表(tabs),空行(blank lines),或是由上述的组合造成的. 在一些上下文中,比如说, 空白是不被允许的,它会导致语法错误.
空行不会影响脚本的行为,因此使用它可以很好的划分独立的函数段以增加可读性。
特殊变量用 来分隔一些输入命令的分隔符,默认是空白符。
为了在字符串或在变量中产生空白,应该使用.
shell处理花括号 扩展. 这个命令处理扩展的结果. | ||
例外: 作用管道一部分的花括号代码块可以在中 运行.
| ||
一个换行("新行") 也是一个空白字符。这就解释了为什么一个只包含一个换行符的空白行也被认为是空白了。 |