UNIX Shell 编程(2)
UNIX Shell 编程(2)
字符匹配
星号(*)匹配0个以上的字符;而问号(?)则匹配1个字符。
如:
ls [a-z]*[0-9]
表示显示文件名以小写字母开始,且以数字结尾的文件列表。
输出重定向
命令的输出一般是提交到标准输出设备,可以转向到文件内,这叫输出重定向。
在有标准输出的命令后,添加>file符号后,命令的输出就会写入文件file。
如:
[root@localhost misc]# who
root pts/1 2009-04-14 09:39 (10.3.34.117)
fedora tty7 2009-04-14 10:44 (:0)
[root@localhost misc]# who >users
[root@localhost misc]# ls
collect mon users wb wbb2 wbx writeback
[root@localhost misc]# cat users
root pts/1 2009-04-14 09:39 (10.3.34.117)
fedora tty7 2009-04-14 10:44 (:0)
另一种类型的输出重定向,由字符>>表示,它意思是命令的输出从标准输出追加到指定的文件后面。因此,文件以前的内容不会丢失,新的输出添加到最后。
如:
[root@localhost misc]# cat users
root pts/1 2009-04-14 09:39 (10.3.34.117)
fedora tty7 2009-04-14 10:44 (:0)
[root@localhost misc]# ls
collect mon users wb wbb2 wbx writeback
[root@localhost misc]# ls >>users
[root@localhost misc]# cat users
root pts/1 2009-04-14 09:39 (10.3.34.117)
fedora tty7 2009-04-14 10:44 (:0)
collect
mon
users
wb
wbb2
wbx
writeback
Shell能识别一种特别格式的输出重定向,如果输入:
> file
前面没有命令,shell会创建一个空文件(长度为0字符),如该文件以前存在,其内容会丢失。
如:
[root@localhost misc]# >file4
[root@localhost misc]# wc file4
0 0 0 file4
[root@localhost misc]# cat file3
This is in file1.
This is in file2.
This is in file1.
[root@localhost misc]# >file3
[root@localhost misc]# wc file3
0 0 0 file3
输入重定向
同输出重定向,命令的输入也可重定向为来自于文件。用大于号>表示输出重定向,用小于号表示输入重定向。
如:
[root@localhost misc]# wc -l users
9 users
[root@localhost misc]# wc -l < users
9
管道
统计当前登陆进系统的用户数:
[root@localhost misc]# who >users
[root@localhost misc]# wc -l < users
2
表明有2个用户登陆了系统。在任何适合如果想知道有多少登陆用户,都可以使用此命令序列。
还有一种方法来判断登陆用户数而不需要使用文件。
Unix系统可以把两条目录的效果连接起来,这种连接称为管道。
管道可以把一条命令的输出直接作为另一条命令的输入。
管道效果由字符 | 实现,它必须在两条命令之间。
故统计登陆用户数可以这么实现:
[root@localhost misc]# who | wc -l
2
在两条命令间建立管道后,第一条命令的标准输出就直接连接到第二条命令的标准输入。
如统计当前目录的文件数:
[root@localhost misc]# ls | wc -l
11
过滤器
Unix所指的过滤器是指能够从标准输入中接受输入,对输入进行处理后,把结果写入标准输出的任何程序。
命令cat和sort是过滤器,而who、date、cd、pwd、echo、rm、mv及cp都不是。
标准错误
除标准输入和标准输出之外,还有一种标准设备,称之为标准错误。
标准错误默认也是终端。
如:
[root@localhost misc]# ls n*
ls: cannot access n*: No such file or directory
见上面,“cannot access...”信息实际上是由ls命令写入标准错误,而非标准输出。
[root@localhost misc]# ls n* > foo
ls: cannot access n*: No such file or directory
尽管输出重定向到文件foo,该信息仍然在终端显示了。且:
[root@localhost misc]# wc foo
0 0 0 foo
foo文件为空。
标准错误也可重定向到文件,格式为:
命令 2> 文件
注意:2和>之间不能有空格。
如:
[root@localhost misc]# ls n* 2> foo
[root@localhost misc]# cat foo
ls: cannot access n*: No such file or directory
一行可以键入多条命令,命令间用分号分隔。
比如既查看当前时间又查看当前工作目录:
[root@localhost misc]# date;pwd
Tue Apr 14 11:29:15 CST 2009
/tools/test/misc
命令发送到后台
有些命令执行时间很长,可以放到后台执行。在键入的命令之后跟一个&符号,该命令就发送到后台执行。
如:
[root@localhost misc]# sort file3 > out & #sort发往后台执行
[2] 30584 # 进程id
此时,终端可立即做其它工作。
[2] 30584 解释:第一个称为该命令的工作号,第二个是进程标识号。
可以用ps命令查看:
[root@localhost misc]# ps
PID TTY TIME CMD
2303 pts/1 00:00:00 bash
30354 pts/1 00:00:00 sort
30589 pts/1 00:00:00 ps
[2]- Done sort file3 > out
ps可以显示系统中正运行的进程的信息。
PID进程标识号,TTY进程终端号,TIME进程已运行的时间,CMD进程名。
如果加上-f选项,将显示更详细内容。
[root@localhost test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 30665 30657 0 12:30 pts/2 00:00:00 -bash
root 30775 30665 0 13:17 pts/2 00:00:00 ps -f
注:PPID父进程的标识号,STIME进程启动时间,以及命令参数。