hanjinping 2011-06-22
shell的种类
Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
在终端输入:
A、选项和参数
1、cd Document;
2、ls -l (加入-l选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间。大多数命令都被设计为可以接纳参数。参数是在命令行中的选项之后键入的一个或多个单词)
wangqun@wangqun-desktop:~/Documents$ ls -l 总用量 12 drwxr-xr-x 19 wangqun wangqun 4096 2011-06-20 01:39 sqmy drwxrwxr-x 12 wangqun wangqun 4096 2011-03-28 06:05 vimfiles drwxr-xr-x 19 wangqun wangqun 4096 2011-05-24 23:42 zbs
3、ls -l sqmy (将显示sqmy目录下的所有文件及其信息)
wangqun@wangqun-desktop:~/Documents$ ls -l sqmy 总用量 332 drwxr-xr-x 7 wangqun wangqun 4096 2011-05-24 02:54 app drwxr-xr-x 2 wangqun wangqun 4096 2011-05-24 02:54 bat_tasks -rw-r--r-- 1 wangqun wangqun 151 2010-05-19 03:01 Capfile drwxr-xr-x 10 wangqun wangqun 4096 2011-06-15 01:48 config drwxr-xr-x 2 wangqun wangqun 20480 2011-06-20 01:38 coverage -rw-r--r-- 1 wangqun wangqun 259 2010-05-19 03:01 cucumber.yml drwxr-xr-x 4 wangqun wangqun 4096 2011-06-19 22:00 db -rw-r--r-- 1 wangqun wangqun 217088 2010-05-19 03:01 destroy drwxr-xr-x 2 wangqun wangqun 4096 2011-05-24 02:54 doc -rw-r--r-- 1 wangqun wangqun 16384 2010-05-19 03:01 exit drwxr-xr-x 4 wangqun wangqun 4096 2011-06-15 01:48 features drwxr-xr-x 5 wangqun wangqun 4096 2011-05-24 02:54 index
B、命令行特征
1. 通配符
通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号[ ]中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
* 代表任何字符串(长度可以不等),例如:“f*”匹配以f打头的任意字符串。但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。
? 代表任何单个字符。
[] 代表指定的一个字符范围,只要文件名中[ ]位置处的字符在[]中指定的范围之内,那么这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f [a- d] 与f [abcd]的作用相同。Shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。
当前目录下所有文件的名称。
*Text*
当前目录下所有文件名中包含有Text的文件的名称。
[ab-dm]*
当前目录下所有以a、b、c、d、m开头的文件的名称。
[ab-dm]?
当前目录下所有以a、b、c、d、m开头且后面只跟有一个字符的文件的名称。
/usr/bin/??
目录/usr/bin下所有名称为两个字符的文件的名称。
特别需要注意的是,连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了。而*和?只在方括号外面是通配符,若出现在方括号之内,它们也失去通配符的能力,成为普通字符了。例如,模式“- a[*?]abc”中只有一对方括号是通配符,*和?均为普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。
最后说明一下使用通配符时需要注意的一些问题。由于*、?和[]对于shell来说具有比较特殊的意义,因此在正常的文件名中不应出现这些字符。特别是在目录名中不要出现它们,否则Shell匹配起来可能会无穷的递归下去。另外要注意的一点是:如果目录中没有与指定的模式串相匹配的文件名,那么Shell将使用此模式串本身作为参数传给有关命令。这可能就是命令中出现特殊字符的原因所在。
C、引号
在shell中引号分为三种:单引号,双引号和反引号。
1、单引号 ‘
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如:
wangqun@wangqun-desktop:~/Documents$ string='$$$pash' wangqun@wangqun-desktop:~/Documents$ wangqun@wangqun-desktop:~/Documents$ echo $string $$$pash
2、双引号 “
由双引号括起来的字符,除$、、’、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是用其后指定的变量的值来代替这个变量和$;对于而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上的只有四个字符$,,’和”本身。而对”号,若其前面没有加,则Shell会将它同前一个”号匹配。
例如,我们假定PATH的值为.:/usr/bin:/bin,输入如下命令:
wangqun@wangqun-desktop:~/Documents$ test="$PATH\"$PATH" wangqun@wangqun-desktop:~/Documents$ wangqun@wangqun-desktop:~/Documents$ echo $test /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
3、反引号 `
反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如:
wangqun@wangqun-desktop:~/Documents$ string="current directoue is `pwd`" wangqun@wangqun-desktop:~/Documents$ echo $string current directoue is /home/wangqun/Documents
shell执行echo命令时,首先执行`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部分,最后输出替换后的整个结果。
利用反引号的这种功能可以进行命令置换,即把反引号括起来的执行结果赋值给指定变量。例如:
wangqun@wangqun-desktop:~/Documents$ today=`date` wangqun@wangqun-desktop:~/Documents$ echo Today is $today Today is 2011年 06月 22日 星期三 04:33:53 EDT
反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜线()将其转义。
D、标准输入和输出
我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
wangqun@wangqun-desktop:~/Documents$ cat hell hell config config bu bu
用户输入的每一行都立刻被cat命令输出到屏幕上。
另一个例子,命令sort按行读入文件正文(当命令行中没有给出文件名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。
wangqun@wangqun-desktop:~/Documents$ sort Jan Feb Mar Feb Jan Mar
这时我们在屏幕上得到了已排序的字符串。
直接使用标准输入/输出文件存在以下问题:
输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。
输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。
为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。
E、 输入重定向
如果给出一个文件名作为wc命令的参数,如下例所示,wc将返回该文件所包含的行数、单词数和字符数。
$ wc /etc/passwd 20 23 726 /etc/passwd
另一种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输入。输入重定向的一般形式为:命令<文件名。可以用下面的命令把wc命令的输入重定向为/etc/passwd文件:
$ wc < /etc/passwd 20 23 726