红联Linux门户
Linux帮助

shell 编程 (转)

发布时间:2005-08-02 23:13:49来源:红联作者:kerzy
Shell 编程基础
作者: haixiao ouyang

Shell: 是一个独立于 OS 的应用程序,是一个具有交互性的命令行解释器。

1、Shell 的作用: 解释键入的命令以及执行的一些特定的功能,并传到内核执行。

2、Shell 的功能:
- 命令的搜索与执行
- 变量的值的替换
- 命令的替换
- 文件名的补齐
- 控制 I/O 重定向和 Pipe
- 提供解释性的编程接口(包括测试、分支和循环)

3、常用的 Shell:
- Bourne Shell(/usr/bin/sh)
- C Shell(/usr/bin/csh)
- Korn Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- Restricted Bourne Shell(/usr/bin/rsh)
- Restricted Korn Shell(/usr/bin/rksh)

[注]
(1)、某些系统有自带的 Shell,比如 SCO UNIX 系统有 SCO Shell(/usr/bin/scosh)。
(2)、使用限制版 Shell 的用户不能进行的操作:
- 修改目录
- 重设 PATH 环境变量
- 在路径中使用 /
- 重定向输出

--> 别名化:主要用于方便地输入长路径名。

$ alias [name [=string]] # Aliasing
其中: name -- 命令的别名, string -- 原命令(如果有空格,用 ‘ ’ 括起来)。

$ alias # 显示当前定义的所有别名

$ alias name # 列出某特定别名的值

$ unalias name # 关闭别名

[例]别名的使用:

$ alias go = 'cd '
$ alias there = /home/cheyenne/programs/shell/pgs_en_c/server.c
$ go there ; pwd

--> 命令历史:

1、最早由 C Shell(BSD UNIX)提出。

2、Korn Shell 下的 history 命令:
- 缺省显示最近输入的16个命令
- 每行用命令号开头
CODE
$ history -n # 显示最后 n 个命令
$ history a z # 显示从第 a 条命令到第 z 条命令


3、
HISTSIZE 参数:定义可以访问历史命令的数据(缺省:128)。
HISTFILE 参数:指定存储已输入命令的文本文件(缺省: .sh_history)。

4、重新输入命令:
$ r n # n 是命令号或一个命令的首字母(执行以该字母开头的最近的命令)

--> 用户环境:

1、环境描述的是会话过程:
- 主目录的路径名
- 存放 e-mail 的目录
- 工作的时区
- 登录的身份
- Shell 搜索命令时的路径
- 终端类型
- 应用程序所依赖的其它东西

2、常见的环境变量:
- TERM, COLUMNS 和 LINES 描述终端
- HOME 用户主目录
- PATH 搜索命令的地点列表
- LOGNAME 登录用户名
- env 和 HISTFILE 专用的 POSIX Shell 变量
- DISPLAY 专用的 X Window 变量

3、设定 Shell 变量:
$ name=value
[规定]变量名以字母开头,可以包含字母、数字和下划线。

4、PATH 变量:和 DOS 里的 PATH 变量是一样的,代表 Shell 搜索命令的一系列目录。

5、TERM 变量:描述使用的终端。
$ TERM=70092
$ tset # 将 TERM 值设置终端
[注]可以查看 /usr/lib/terminfo 下的子目录

6、常见的变量及其值:
- EDITOR=/usr/bin/vi # 用 vi 作为行编辑命令
- ENV=$HOME/.shrc # 在启动 Shell 时执行 $HOME/.shrc
- HOME=/home/cheyenne # 用户主目录
- FCEDIT=/usr/bin/vi # 对历史命令行启用 vi 编辑进程
- ~ # 在 Korn Shell 和 POSIX Shell 中代表用户主目录
- HISTFILE=$HOME/.sh_history
- LOGNAME=cheyenne
- MAIL=/var/mail/cheyenne # 系统信箱
- OLDPWD=/home # 前一个目录的位置
- PATH=……
- PS1='[!]$' # 设置提示符
- PWD=/home/cheyenne/programs/shell # 显示当前工作目录(相当于 DOS 中的 CD 命令)
- SHELL=/usr/bin/sh
- TERM=2392a # 用命令 eval `test -s -Q -h` 在启动时,系统读取 /etc/ttytype 文件,用里面的信息正确设置终端。
- TMOUT=300 # 在指定的时间(秒)内没有键入命令,Shell 会终止或超时。
- TZ=EST5EDT # 工作时区
--> 登录:
1、显示文件 /etc/issue 的内容
2、发出 login 提示符
3、运行 login
4、核对帐号和密码
5、将用户置于主目录
6、运行用户的 Shell
7、运行 /etc/profile(Bourne Shell 和 Korn Shell)或 /etc/csh.login(C Shell)
8、运行用户主目录中的 .profile 或 .login
9、执行主目录中的 .kshrc 文件
10、显示 Shell 提示符

[注] /etc/profile 文件搭建起系统每个用户的基本环境
运行 Shell --> 从 /etc/profile 系统命令文件中读出命令 --> 读取 $HOME/.profile 文件(细化环境以适应用户的要求)


--> 用 CDE 登录:

CDE 通常不使用 /etc/profile、$HOME/.profile 和 $HOME/.login 这几个登录脚本。

但可以强迫执行 $HOME/.profile(sh 或 ksh)或 $HOME/.login(csh)。
方法是在 .dtprofile 中设置: DTSOURCEPROFILE=true
--> Shell 启动文件:

- Bourne Shell(/usr/bin/sh): $HOME/.profile
- Korn Shell(/usr/bin/ksh): $HOME/.profile,$HOME/.kshrc
- C Shell(/usr/bin/csh): $HOME/.login,$HOME/.cshrc

1、普通用户没有 /etc/profile 文件的写权限。

2、Korn Shell 有一个可选的配置文件 .kshrc,它不仅在启动时被读取,在每次启动一个新的 Shell 时都被读取。要使用这个文件,在 .profile 文件里加入:
ENV=~/.kshrc
export ENV

3、可以在 .profile 中加入 exec 命令: exec app,作用是启动用户的应用程序,但是无法看到 Shell 提示符,应用程序执行完毕后,退出系统。

4、以 C Shell 登录时,在起始目录查找 .login 文件。如果找到,出现提示符前执行这个文件里面的命令。如果用户还定义了 .cshrc 文件,出现提示符前也执行这个文件里的命令。



--------------------
--> Shell 的高级特性:

1、在 Shell 中,有三种替换功能,可以加快对命令行的输入和执行:
- 变量替换
- 命令替换
- 波浪号替换

2、Shell 变量存储机制:

(1)、在 Shell 中,有两块内存存储 Shell 变量:本地数据区和用户环境区。
- 定义新变量:从本地数据区分配内存存储该变量。在这个区域的变量归当前 Shell 所有。任何后来启动的子进程都不能访问这些本地变量。
- 在登录进程中系统定义一些特殊的 Shell 变量,其中的很多被存储在用户环境区。
- 从本地数据区移动到用户环境区的变量可以被子进程访问。

(2)、$ env # 显示当前环境的所有变量

3、给变量赋值: $ name=value
- 用户定义一个新变量:被存储在本地数据区中。
- 将一个新值分配给一个已经存在的环境变量:新值取代旧值。

4、变量替换: $ name # Directs the shell to perform variable substitution.

(1)、每个被定义的变量有一个值与其相关,变量名前加 $ 符号时,Shell 用值来替换这个参数。这个过程称为变量替换。这个过程在 Shell 运行命令行命令之前执行。

(2)、Shell 将命令行中所有需要替换的变量做替换之后才执行该命令。

(3)、变量可以代表命令、命令的参数或整行命令行。

(4)、$ echo $name # 显示变量的当前值
[例]$ PATH=$PATH:$HOME
$ echo $PATH
$ file_name=$HOME/programs/pgs_en_c/server.cpp
$ more $file_name

(5)、有两个变量:
$ file1=this
$ file2=that
$ echo $file1and$file2 # Shell 会认为是查找变量 file1and 和变量 file2
sh: file1and: parameter not set
$ echo ${file1}and$file2 # 解决方案:用大括号界定变量名与其周围的文本
thisandthat

(6)、用绝对路径名定义一个变量的值,通过使用该变量,可以在文件系统的任何位置访问目标文件或目录。

(7)、引号的作用:
$ cheyenne=2
$ echo cheyenne # 在屏幕上显示 cheyenne
$ echo $cheyenne # 在屏幕上显示 2
$ echo “$cheyenne” # 在屏幕上显示 2
$ echo '$cheyenne' # 在屏幕上显示 $cheyenne

5、命令替换:同一个命令行中用一个命令的输出结果替换该命令。
$ `command`
常用于将一个命令的输出结果分配给一个变量,然后引用或控制该变量。
[例]$ banner data
$ banner `data`

6、波浪号替换:
- 若一个词以 ~ 开头,这个词会扩展这个波浪号。
- 只能扩展位于单词开头的波浪号(/~home/cheyenne 不能扩展其中的波浪号)。
- 单独的一个 ~ 或在 / 之前的 ~ : 用 $HOME 取代~。
- ~+ : 用 $PWD 取代 ~(cd 命令将重设 PWD 的值)。
- ~- : 用 $OLDPWD 取代 ~(cd 命令将重设 OLDPWD 的值)。
- 若 ~ 后面紧跟几个字符,然后接一个 /,Shell 会核对这几个字符是否与某系统用户名匹配,若匹配,就用该用户名取代~。

7、显示变量的值:
$ env # 显示在用户环境中定义的所有的变量的值
$ set # 显示在本地数据区和用户环境中当前定义的所有变量的值
$ unset # 删除指定变量的当前值(该变量的值将被指定为 NULL,此值有效)

8、将本地变量转移到用户环境中:
$ export variable
$ export varibale=value # 给变量赋值并转移
$ export # 显示所有被输出变量的名字及其值

9、向应用程序传递变量:
(1)、登录后,Shell 程序被载入内核执行。当在提示符下输入一个应用程序(或命令)的名字后,会创建一个子进程,并执行以下程序:
- fork 程序:复制 Shell 进程(包括程序代码、环境数据区和本地数据区)。
- exec 程序:将子进程的代码及本地数据区替换为请求执行的应用程序的代码及本地数据区。
- 执行请求的应用程序后,exec 命令结束。

(2)、执行子进程时,Shell(父进程)会转入睡眠状态,等候子进程结束。一旦子进程结束,它将释放占用的内存,唤醒父进程,这个父进程时刻准备接受另一个命令执行请求。

(3)、本地变量与环境变量:
- 定义新变量:此变量会被存储在与定义该变量的进程有关的本地数据区中。
- 若要使任何一个子进程都能访问这个变量,必须用 export 命令将其导出到用户环境中。
- 一旦此变量处于用户环境中,后来运行的所有子进程都可以访问此变量(用户环境的内容向每一个子进程广播)。
- 父 Shell 的环境变量不会被子进程修改。

10、监控进程:
$ ps [-f] # 显示当前运行(或处于睡眠状态)进程的信息
包括 PID 及 PPID(PID:进程号,PPID:父进程号)。


--> 关于文件名:

1、文件名生成的字符集:
? 匹配任意单个字符(除用点开头的文件外)
[] 从将被匹配的字符里分类(除用点开头的文件外)
* 匹配零字符或更多的字符集(除用点开头的文件外)

2、点文件:
以点开头的文件在文件生成字符集里通常是隐藏的,文件名生成字符集永远也不会生成以点开头的文件名称。

3、三个通配符:
CODE
[例] $ ls -a
. .. .zz 1G 2G 7G 15G Ant Cat Dog abc abcdef ba cyz
$ echo [abc]?? # echo abc cyz
$ echo [1-9][A-Z] # echo 1G 2G 7G
$ echo [!A-Z]?? # echo 15G abc cyzSample Text
文章评论

共有 8 条评论

  1. fuqiyuan 于 2007-03-23 22:52:04发表:

    那位大哥有shell那方面的电子书啊,能不能邮寄给小弟啊.谢谢
    fuqiyuan1984@126.com

  2. honckly 于 2007-03-01 16:49:43发表:

    受教了 !!!

  3. iamfriday 于 2006-12-22 10:28:19发表:

    Linux下常用的Shell应该是Bash吧?
    Bourne Again Shell,免费的~
    相当全面了~~作为学习Shell编程的基础很合适~

  4. bridgebest 于 2006-12-21 23:33:40发表:

    谢谢楼主!!!!

  5. shale 于 2005-10-02 11:56:52发表:

    不错

  6. root 于 2005-08-13 00:53:31发表:

    强贴,顶

  7. artiomgy 于 2005-08-03 12:55:22发表:

    支持

  8. uu 于 2005-08-03 00:13:10发表:

    不错啊,支持