Shell设计(一)
时间:2006-12-18 来源:h0000001
BASH Shell
shell简单历史
第一个流行的shell是由Steven Bourne开发出来的,为了纪念他所以称为Bourne shell,简称sh.后来另一个广为流传的shell是由柏克莱大学的确Bill Joy设计的依附BSD版的Unix系统中的shell,这个shell有点类似C语言,所以得名为C shell,简称csh,是Sun中默认的.Linux使用的是Bourne Again Shell(bash),这个shell是Bourne shell的增强版本.是基于GNU的架构下发展而来的.其它还有,商业上常用的K Shell以及TCSH等.
BASH主要的优点:
命令编辑能力(类似DOS的doskey功能),它能记忆使用过的指令,按上下键可以查找.~/.bash_history记录的是上一次登入以前执行的指令.
补全功能(比对数据正确性):可以补全指令与文件名称.按下Tab键可以补全,如果有重复的,按两下Tab可以列出所有重复的项.
命令别名(alias)设定功能: alias lm='ls -al' ,取消用unalias lm
作业控制,前景背景控制:
Shell Scripts的强大功能:类似DOS中的批处理而功能又强于批处理.
vi文本处理器
vi分为三种模式:一般模式,编辑模式,命令行模式.
一般模式:
以vi处理文件时,一进入该文件就是一般模式.在此模式下,可以使用上下左右按键来移动光标,可以使用"删除字符"或"删除整行"来处理文件内容,也可以使用复制,粘贴来处理文件数据.
编辑模式:
在一般模式下可以按i,I,o,O,a,A,r,R等字母进入编辑模式,将出现INSERT或REPLACE等字样.按ESC从编辑模式退到一般模式.
命令行模式:
在一般模式中,输入":"或"/"就可以将光标移动到最未一行,在这个模式中,可以搜寻数据,读取,存盘,大量字符替换,退出vi,显示行号等动作.
常用指令
一般模式 光标移动
h或向左方向键 光标向左移动一个字符
j或向下方向键 光标向下移动一个字符
k或向上方向键 光标向上移动一个字符
l或向右方向键 光标向右移动一个字符
ctrl+f (forward) 屏幕向前翻动一页
ctrl+b (back) 屏幕向后翻动一页
ctrl+d 屏幕向前翻动半页
ctrl+u 屏幕向后翻动半页
+ 光标移动到非空格符的下一列
- 光标移动到非空格符的上一列
n<space> 按下数字后再按空格键,光标会向右移动这一行的n个字符.
0 移动到这一行的的第一个字符处
$ 移动到这一行的最后一个字符处
H 光标移动到这一屏幕的最上方的那一行
M 光标移动到这一屏幕的最中央的那一行
L 光标移动到这一屏幕的最下方的那一行
G 移动到这个文件的最后一行
nG 移动到这个文件的第n行.
n<Enter> 光移向正步移动n行
一般模式 查找与替换
/word 在光标之后查找一个名为word的字符串
?word 在光标之前查找一个名为word的字符串
:n1,n2s/word1/word2/g 在第n1与n2行之间查找word1字符串,并将该字符串替换为word2
:1,$s/word1/word2/g 从第一行到最后一行查找word1字符串,并将该字符串替换为word2
:1,$s/word1/word2/gc 从第一行到最后一行查找word1字符串,
变量与变量的设定
echo 显示变量的值
语法: #echo $variable <==如果不加$,则会直接显示后面接的字符串
env 读取当前系统中的主要变量.注:使用大写字母设定的变量一般都是系统的预设变量.
语法: #env
set 显示当前系统中的环境变量,同时也显示用户自定义变量.
语法: #set
变量设定规则
1.变量与变量内容以等号"="连结;
2.等号两边不能直接接空格符;
3.变量名称只能是英文字母与数字,其中数字不能是开头字符;
4.若有空格符,可以使用双引号或单引号将变量内容结合起来,但要特别注意,双引号的特殊字符可以保留变量特性,单引号内的特殊字符则仅为一般字符;
5.必要时以跳转字符"\"将特殊符号变成一般符号;
6.在一串指令中,还需要借其他指令提供的信息,可以使用quote"`command`";
7.若该变量为扩增变量内容时,则需要以双引号及$变量名称(如"$PATH":/home)继续累加内容;
8.若该变量需要在其他子程序执行,则以export使变量可以动作;
9.通常大写字符为系统预设变量,自定义变量可以使用小写字符,方便判断;
10.取消变量的方法为:unset 变量名称
example:
#name=h0000001 <==设置变量name,并赋值为h0000001
#name="H0000001's blog" 或 #name=H0000001\'s\ blog <==有特殊字符时的格式
#name="$name"isme <==变量值的累加
#cd /lib/modules/`uname -r`/kernel <==指令中的指令
#unset name <==取消变量
Note:在设置变量时,单引号与双引号有什么不同:
单引号与双引号最大不同在于双引号仍然可以保留变理的内容,但单引号仅能是一般字符,而不会有特殊字符.
如:
[root@mail root]# name=h0000001
[root@mail root]# echo $name
h0000001
[root@mail root]# myname="$name its me"
[root@mail root]# echo $myname
h0000001 its me
[root@mail root]# myname='$name its me' <==使用单引号时,$name将失去原有的变量内容,仅为一般字符的显示.
[root@mail root]# echo $myname
$name its me
[root@mail root]#
在输入指令的过程中,quote(`)这个符号代表的意义是什么?
在一串指令中,在`之内的指令将被首先执行,而其执行结果将作为外部的输入信息.
export 变量
unset 变量
历史命令(history)
history的用法
#history
#[!number][!command][!!]
detail:
number: 第几个指令
command: 指令开头的几个字母
!: 上一个指令
history指令与"!"的用法很多,如果要执行上一个指令,除使用上下键之处,还可以直接以!!来表示,要执行第n条指令,可以使用!n表示;也可以使用指令标号,如!vi表示执行最近指令开头是vi的指令.
BASH Shell的配置文件
系统设定值
所谓的系统设定值,也就是每个用户进入到bash shell之后先读取的配置文件.默认有以下几个
1./etc/profile: 这个文件设定了几个重要的变量,如PATH,USER,MAIL,HOSTNAME等,也同时规划出/etc/inputrc这个针对键盘热键设定的文件数据内容.它还规化出/etc/profile.d这个目录.
2./etc/bashrc: 此文件用于规化umask,同时规化提示符的内容(就是PS1)
3./etc/man.config: 此文件的内容规范了使用man时man page的路径在哪里.
个人设定值
个人设定值就是存在个人根目录的那几个隐藏文件.
1.~/.bash_profile: 定义了个人路径(PATH)与环境变量的文件名称.
2.~/.bashrc: 对于个人喜好的bash设定是最重要的,在这里设定个人变量.
3.~/.bash_history: 此文件用于记录曾经用过的命令.
4.~/.bash_logout: 此文件是在注销shell时bash要为你做的事情.
source 在不注销的情况下直接读入变量配置文件.
语法: #source 变量配置文件
通配符与特殊符号
符号 内容
* 通配符,代表任意字符
? 代表一个字符
# 注释
\ 跳转字符,将特殊字符或通配符还原成一般字符
| 分隔两个管线命令的界定
; 连续性命令的界定
~ 用户的根目录
$ 即变量前需要加的变量值
& 将指令变成在背景下工作
! 逻辑运算中的"非"(not)
/ 路径分隔符
>,>> 输出导向,分别为"取代"与"累加"
' 单引号,不具有变更置换功能
" 具有变量置换功能
`` 两个``中间为可以行执的指令
() 中间为子shell的起始与结束
[] 中间为字符组合
{} 中间为命令区块组合
组合键 内容
Ctrl+C 终止当前命令
Ctrl+D 输入结束(EOF)
Ctrl+M 就是Enter
Ctrl+S 暂停屏幕的输出
Ctrl+Q 恢复屏幕的输出
Ctrl+U 在提示符下,将整行命令删除
Ctrl+Z 暂停当命令
连续输入指令的方式 #command1; command2 两个指令间用";"分隔,代表不论command1执行结果为何,command2都会被执行 #command1 && command2 &&代表当command1执行结果返回0值时,也就是没有错误信息时,command2才会开始执行 #command1 || command2 ||代有当command1有错误信息时,command2才会执行. 命令重定向 什么是重定向(redirect)? 简单地说,就是将目当所得到的数据转到其他地方. 标准输入: 代码为0,或称为stdin,使用方式为< 标准输出: 代码为1,或称为stdout,使用方式为1> 错误输出: 代码为2,或称为stderr,使用方式为2> 基本的指令书写方式为: 指令 > 设备或文件 <==将原来由屏幕输出的正确数据输出到>右这的文件或设备; 2> <==将原来该由屏幕输出的错误数据输出到2>的右边的文件或设备; >> <==将原本由屏幕输出的正确数据累加输出到>>右边的文件中; < <==由<的右边读入参数文件; /dev/null <==可视为垃圾设备 example: #ls -al > list.txt <==将显示结果输出到list.txt文件中,若该文件己存在则予以取代 #ls -al >> list.txt <==将显示结果累加到list.txt文件中,该文件为累加,旧数据保留 #ls -al 1> list.txt 2> list.err <==将显示数据正确输出到list.txt,错误的数据输出到list.err #ls -al 1> list.txt 2> &1 <==将显示数据不论正确或错均输出到list.txt #ls -al 1> list.txt 2> /dev/null <==将显示的数据,正确的输出到list.txt,错误的数据予以丢弃. 管线命令 管线命令使用的是"|"界定符号. 管线命令"|"仅能处理经由前一个指令传来的正确信息,也就是标准输出(stdout)信息,对于标准错误信息并没有直接处理能力.每个管线部分都是指令,而后一个指令的输入是前一个指令的输出. cut 将同一行里的数据进行分解. 语法: #cut -d "分隔字符" [-cf] fields 参数说明: -d: 后面接的是分隔字符,默认是空字符 -c: 后面接的是第几个字符 -f: 后面接的是第几个区块 sort 语法: #sort [-t 分隔符][(+起始)(-结束)][-nru] 说明: -t 分隔符: 使用分隔符隔开不同区块,默认是tab +start -end: 由第start区块排序到end区块 -n: 使用纯数字排序(否则会以字母方式排序) -r: 反向排序 -u: 相同出现的一行,只列出一次 wc 相当有用的计算文件内容的一个工具组 语法: #wc [-lmw] -l: 多少行 -m: 多少字符 -w: 多少字 uniq 删除重复的行从而只显一个 语法: #uniq tee 同时将数据显示在屏幕上和存到文件中 语法: #last | tee last.txt tr 语法: #tr [-ds] SEM1 -d: 删除SEM1这个字符串 -s: 取代重复的字符 example: #last | tr '[a-z]' '[A-Z]' #cat /etc/passwd | tr -d : split 分割文件 语法: #split [-bl] 输入文件 输出文件前导字符 -b: 以文件size来分 -l: 以行数来分