linux从入门到精通读薄(四)Bash

第四章 Bash

4-1 路径名扩展

*    用来表示任何文件名(以点开头的文件名称除外)

$ cp text/* backup        复制text下的全部文件到backup

?     用来代表任何单个字符

$ ls /dev/tty?

[ ]    显式清单

$ ls /dev/tty?[23456]
/dev/ttys2 /dev/ttyp2 /dev/ttyq3 /dev/ttyr5 /dev/ttys4
……
匹配的范围还可用一对字符中间加连字符(-)表示

$ ls /dev/tty?[2-6]

{ }    指定整个字的清单

$ mkdir /usr/tmp/{bin,doc,lib,src}
$ ls /usr/tmp
bin doc lib src

有时用一条命令时,送给命令的参数中包含部分或全部特殊字符。这时,要用到引用技术。它告诉shell不管这些被引用字符的特殊含义,将它们作为普通字符一样对待。
bash shell提供三种引用方法:转义字符(\)、单引号(')和双引号(")。

每个需要抑止特殊含义的特殊字符前面都要放一个转义字符:

$ cd
$ mv text/motd text/m\*\?
$ ls text
m*? passwd

如果将字符串放在一对单或双引号之间,则单引号之间的所有字符的特殊含义都将被抑止

4-2 输入/输出重定向

标准输出重定向

>        将命令结果送到>后的文件中,如果文件不存在,则建立这一文件。
>>      将命令结果追加到>>后的文件中。

错误输出重定向
2>
2>>

将标准输出和错误输出同时送到同一文件中,可以使用另一个输出重新定向操作符(&>):

$ ls /usr/tmp &>output.file

输入重定向

<

如:
$ wc </etc/passwd           统计passwd的字数

另一种输入重新定向称为here文档。它告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用(<<)。它将一对分隔符(delimiter)之间的正文重新定向输入给命令:

$ wc <<delim
>this text forms the content
>of the here document, which
>continues until the end of
>text delimiter
>delim
4 17 98

当将正文送入here文档时,不必在每行前面加大于符号,它们由shell作为提示符提供。shell用这个提示符告诉你当前的命令还未结束。它在执行命令之前将等待更多的输入。
在<<操作符后面,任何字符都可以用作正文开始前的分隔符,本例中使用delim作为分隔符。here文档的正文一直继续到遇到另一个分隔符为止。第二个分隔符就出现在新行的开头。这时here文档的正文,不包括开始和结束的分隔符,将重新定向送给命令,作为它的标准输入。

4-3 管道

管道使用竖杠(|)作为重新定向操作符

$ ls /usr/bin | wc -w
459

4-4 后台作业

在命令行后面加上&字符,可以将命令放到后台(background)去执行:

$ ls -1R/ >/tmp/ls.1R &

4-5 作业控制

每次用bash执行一条命令时,它都给命令分配一个作业号(job number)。当多个命令在管道行中结合在一起时,将它们作为一个作业对待,给它们分配一个作业号。
作业控制允许将进程挂起并在以后恢复进程的执行。

显示作业清单:

$ jobs

挂起当前的前台作业:

ctrl-z

恢复进程执行:

$ fg        回到前台执行
$ bg       在后台执行

如果不是恢复默认作业,而是恢复作业表中其他作业的运行,可以在命令中用%号后面跟作业号的办法给以明确规定。

$ fg %1
cat >text.file

结束作业:

$ kill
$ kill %1

4-6 历史表

历史表一般能保存500行命令。当退出登录时,bash自动将当前的历史表保存到一个文件中。默认的文件名是.bash_history,存于起始目录下,为隐藏文件。

查看历史表:

$ history | tail -5
511 cat >text.file
512 cd ..
……

历史表中的每一行称为一个事件,行号称为事件号。

重复执行历史命令:

$ ! (事件号)

其中!称为历史替换操作符。

重复最后一条命令:

$ !!

还可以用类似下面的命令:

$ ! ls*

它将执行匹配的第一条命令。

4-7 命令行编辑

为了简化寻找、修改和重新执行历史表中的命令的任务,bash同样允许你对命令进行简单的编辑。如果键盘支持光标移动键(箭头键)。每按一次上箭头键,shell将在历史表中后移一行,并显示上一命令行。按下箭头键则向前移一行。当找到需要的命令时,只要按Enter键就可以重复执行这条命令。

4-8 命令补全

在送入命令的任何时刻,可以按Tab键,shell将试图补全此时已输入的部分命令

4-9 shell函数

用shell函数来组合和存储一组供以后执行的命令是一种方便的途径。shell函数定义的形式如下:

name() {list;}

其中name是用来执行函数的命令名称。而list则是命令或管道行清单,它们之间用分号分开,用来规定函数执行的任务。

例如,若送入下列函数定义:

$ ll() {ls -l;}

就能用ll作为命令来完成ls -l命令同样的功能:

$ ll
drwxr-xr-x 3 pc book 1024 May 28 23:30 book

有了II的定义,可能会认为可以用ll -a来执行ls -al命令。遗憾的是情况并不是这么简单。这是做得到的,但II的定义必须按以下的方式加以改变:

$ ll() {ls -l $*;}

增加$*字符表示在II命令后面送入的任何参数或命令开关应插到ls -l命令中取代$* 字符。
shell的函数体可以由若干条命令或管道行组成,命令或管道行之间用分号分开。