LoveUnix » 编程开发 & Rational » Shell 编程基础[原创]
让LU留住您的每

一天 让LU博客留住您的每一天
2004-3-9 22:15 carol
<span style='font-size:14pt;line-height:100%'><span style='color:blue'><b>Shell 编程基础[原创]</b></span></span><br />from: Cheyenne <br /><br />--&#62; <span style='color:blue'>Shell: 是一个独立于 OS 的应用程序,是一个具有交互性的命令行解释器。</span><br /><br />1、<b>Shell 的作用</b>: 解释键入的命令以及执行的一些特定的功能,并传到内核执行。<br /><br />2、<b>Shell 的功能</b>:<br />   - 命令的搜索与执行<br />   - 变量的值的替换<br />   - 命令的替换<br />   - 文件名的补齐<br />   - 控制 I/O 重定向和 Pipe<br />   - 提供解释性的编程接口(包括测试、分支和循环)<br /><br />3、<b>常用的 Shell</b>:<br />   - Bourne Shell(/usr/bin/sh)<br />   - C Shell(/usr/bin/csh)<br />   - Korn Shell(/usr/bin/ksh)<br />   - Shell for Root(/sbin/sh)<br />   - Restricted Bourne Shell(/usr/bin/rsh)<br />   - Restricted Korn Shell(/usr/bin/rksh)<br /><br /><span style='color:blue'>[注]</span><br />(1)、某些系统有自带的 Shell,比如 SCO UNIX 系统有 SCO Shell(/usr/bin/scosh)。<br />(2)、使用限制版 Shell 的用户不能进行的操作:<br />           - 修改目录<br />           - 重设 PATH 环境变量<br />           - 在路径中使用 /<br />           - 重定向输出

2004-3-9 22:18 carol
--&#62; <span style='color:blue'>别名化</span>:主要用于方便地输入长路径名。<br /><br /><span style='color:blue'>$ alias [name [=string]]      # Aliasing</span><br />其中: name -- 命令的别名, string -- 原命令(如果有空格,用 ‘ ’ 括起来)。<br /><br />$ alias       # 显示当前定义的所有别名<br /><br />$ alias name      # 列出某特定别名的值<br /><br />$ unalias name   # 关闭别名<br /><br /><b>[例]别名的使用:</b><br /><br />$ alias go = &#39;cd &#39;<br />$ alias there = /home/cheyenne/programs/shell/pgs_en_c/server.c<br />$ go there ; pwd

2004-3-9 22:21 carol
--&#62; <span style='color:blue'>命令历史</span>:<br /><br />1、最早由 C Shell(BSD UNIX)提出。<br /><br />2、Korn Shell 下的 <span style='color:blue'>history </span>命令:<br />     - 缺省显示最近输入的16个命令<br />     - 每行用命令号开头<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--> &nbsp; $ history -n &nbsp; &nbsp; &nbsp; &nbsp;# 显示最后 n 个命令<br /> &nbsp; $ history a z &nbsp; &nbsp; &nbsp; # 显示从第 a 条命令到第 z 条命令<!--c2--></div><!--ec2--><br /><br />3、<br /><span style='color:blue'>HISTSIZE 参数</span>:定义可以访问历史命令的数据(缺省:128)。<br />     <span style='color:blue'>HISTFILE 参数</span>:指定存储已输入命令的文本文件(缺省: .sh_history)。<br /><br />4、重新输入命令:<br />   $ r n        # n 是命令号或一个命令的首字母(执行以该字母开头的最近的命令)

2004-3-9 22:24 carol
--&#62; <span style='color:blue'>用户环境</span>:<br /><br />1、<b>环境描述的是会话过程</b>:<br />   - 主目录的路径名<br />   - 存放 e-mail 的目录<br />   - 工作的时区<br />   - 登录的身份<br />   - Shell 搜索命令时的路径<br />   - 终端类型<br />   - 应用程序所依赖的其它东西<br /><br />2、<b>常见的环境变量</b>:<br />   - TERM, COLUMNS 和 LINES             描述终端<br />   - HOME                                           用户主目录<br />   - PATH                                           搜索命令的地点列表<br />   - LOGNAME                                      登录用户名<br />   - env 和 HISTFILE                             专用的 POSIX Shell 变量<br />   - DISPLAY                                        专用的 X Window 变量<br /><br />3、<b>设定 Shell 变量</b>:<br />   $ name=value<br />[规定]变量名以字母开头,可以包含字母、数字和下划线。<br /><br />4、<b>PATH 变量</b>:和 DOS 里的 PATH 变量是一样的,代表 Shell 搜索命令的一系列目录。<br /><br />5、<b>TERM 变量</b>:描述使用的终端。<br />   $ TERM=70092<br />   $ tset        # 将 TERM 值设置终端<br />   [注]可以查看 /usr/lib/terminfo 下的子目录<br /><br />6、<b>常见的变量及其值</b>:<br />   - EDITOR=/usr/bin/vi            # 用 vi 作为行编辑命令<br />   - ENV=$HOME/.shrc             # 在启动 Shell 时执行 $HOME/.shrc<br />   - HOME=/home/cheyenne    # 用户主目录<br />   - FCEDIT=/usr/bin/vi             # 对历史命令行启用 vi 编辑进程<br />   - ~                                     # 在 Korn Shell 和 POSIX Shell 中代表用户主目录<br />   - HISTFILE=$HOME/.sh_history<br />   - LOGNAME=cheyenne<br />   - MAIL=/var/mail/cheyenne     # 系统信箱<br />   - OLDPWD=/home                # 前一个目录的位置<br />   - PATH=……<br />   - PS1=&#39;[&#33;]$&#39;                         # 设置提示符<br />   - PWD=/home/cheyenne/programs/shell   # 显示当前工作目录(相当于 DOS 中的 CD 命令)<br />   - SHELL=/usr/bin/sh<br />   - TERM=2392a   # 用命令 eval `test -s -Q -h` 在启动时,系统读取 /etc/ttytype 文件,用里面的信息正确设置终端。<br />   - TMOUT=300   # 在指定的时间(秒)内没有键入命令,Shell 会终止或超时。<br />   - TZ=EST5EDT  # 工作时区

2004-3-9 22:25 carol
--&#62; <span style='color:blue'>登录</span>:<br />1、显示文件 /etc/issue 的内容<br />2、发出 login 提示符<br />3、运行 login<br />4、核对帐号和密码<br />5、将用户置于主目录<br />6、运行用户的 Shell<br />7、运行 /etc/profile(Bourne Shell 和 Korn Shell)或 /etc/csh.login(C Shell)<br />8、运行用户主目录中的 .profile 或 .login<br />9、执行主目录中的 .kshrc 文件<br />10、显示 Shell 提示符<br /><br /><span style='color:blue'>[注]</span> /etc/profile 文件搭建起系统每个用户的基本环境<br />运行 Shell --&#62; 从 /etc/profile 系统命令文件中读出命令 --&#62; 读取 $HOME/.profile 文件(细化环境以适应用户的要求)

2004-3-9 22:35 carol
--&#62; <span style='color:blue'>用 CDE 登录</span>:<br /><br />CDE 通常不使用 /etc/profile、$HOME/.profile 和 $HOME/.login 这几个登录脚本。<br /><br />但可以强迫执行 $HOME/.profile(sh 或 ksh)或 $HOME/.login(csh)。<br />方法是在 .dtprofile 中设置: <span style='color:blue'>DTSOURCEPROFILE=true</span>

2004-3-9 22:36 carol
--&#62;<span style='color:blue'> Shell 启动文件</span>:<br /><br />- Bourne Shell(/usr/bin/sh): $HOME/.profile<br />- Korn Shell(/usr/bin/ksh): $HOME/.profile,$HOME/.kshrc<br />- C Shell(/usr/bin/csh): $HOME/.login,$HOME/.cshrc<br /><br />1、普通用户没有 /etc/profile 文件的写权限。<br /><br />2、Korn Shell 有一个可选的配置文件 .kshrc,它不仅在启动时被读取,在每次启动一个新的 Shell 时都被读取。要使用这个文件,在 .profile 文件里加入:<br />   ENV=~/.kshrc<br />   export ENV<br /><br />3、可以在 .profile 中加入 exec 命令: exec app,作用是启动用户的应用程序,但是无法看到 Shell 提示符,应用程序执行完毕后,退出系统。<br /><br />4、以 C Shell 登录时,在起始目录查找 .login 文件。如果找到,出现提示符前执行这个文件里面的命令。如果用户还定义了 .cshrc 文件,出现提示符前也执行这个文件里的命令。

2004-3-9 22:38 carol
--&#62; <span style='color:blue'>whereis 命令</span>:<br /><br /><span style='color:blue'>$ whereis [-b|-m|-s] command</span>       # 搜索指定目录以判断特定的命令是否存在<br /><br />UNIX 系统主要在 /sbin、/usr/bin、/usr/local/bin 和 /usr/contrib/bin 下存放命令,whereis 命令搜索这些目录和其它目录,以判断命令是否存在。<br /><br /><span style='color:blue'>[NOTE]</span><br />1、许多用户在主目录下设有自己的 bin 目录,whereis 不搜索这些目录。<br />2、whereis 可以提供一个途径定位命令文件和定位命令在手册中的位置。<br />3、whereis 命令接受单个参数 —— 命令名,它返回该命令可执行代码的位置及其在手册中的位置。<br />4、若要修改 whereis 搜索的目录列表,用 -b、-m、-s ,使搜索相应的限制在二进制代码、手册或源代码的范围内。<br /><br />[注]whereis 的搜索目录:<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->/usr/src/*<br />/usr/bin<br />/usr/share/man/*<br />/usr/local/games<br />/usr/contrib/man/*<br />/usr/contrib/include<br />/usr/local/man/$LANG/*<br />/usr/sbin<br />/usr/lbin<br />/usr/local/man/*<br />/usr/local/include<br />/usr/contrib/bin<br />/usr/contrib/lib<br />/usr/contrib/man/$LANG/*<br />/sbin<br />/usr/ccs/bin<br />/usr/local/bin<br />/usr/local/lib<br />/usr/contrib/games<br />/usr/share/man/$LANG/*<!--c2--></div><!--ec2-->

2004-3-9 22:45 carol
--&#62; <span style='color:blue'>Shell 的高级特性</span>:<br /><br />1、在 Shell 中,有三种<span style='color:blue'>替换功能</span>,可以加快对命令行的输入和执行:<br />   - 变量替换<br />   - 命令替换<br />   - 波浪号替换<br /><br />2、<b>Shell 变量存储机制</b>:<br /><br />   (1)、在 Shell 中,有两块内存存储 Shell 变量:本地数据区和用户环境区。<br />      - 定义新变量:从本地数据区分配内存存储该变量。在这个区域的变量归当前 Shell 所有。任何后来启动的子进程都不能访问这些本地变量。<br />      - 在登录进程中系统定义一些特殊的 Shell 变量,其中的很多被存储在用户环境区。<br />      - 从本地数据区移动到用户环境区的变量可以被子进程访问。<br /><br />   (2)、<span style='color:blue'>$ env   </span>    # 显示当前环境的所有变量<br /><br />3、<b>给变量赋值: $ name=value</b><br />   - 用户定义一个新变量:被存储在本地数据区中。<br />   - 将一个新值分配给一个已经存在的环境变量:新值取代旧值。<br /><br />4、<b>变量替换: $ name   </b>    # Directs the shell to perform variable substitution.<br /><br />   (1)、每个被定义的变量有一个值与其相关,变量名前加 $ 符号时,Shell 用值来替换这个参数。这个过程称为变量替换。这个过程在 Shell 运行命令行命令之前执行。<br /><br />   (2)、Shell 将命令行中所有需要替换的变量做替换之后才执行该命令。<br /><br />   (3)、变量可以代表命令、命令的参数或整行命令行。<br /><br />   (4)、<span style='color:blue'>$ echo $name   # 显示变量的当前值</span><br />      [例]$ PATH=$PATH:$HOME<br />          $ echo $PATH<br />          $ file_name=$HOME/programs/pgs_en_c/server.cpp<br />          $ more $file_name<br /><br />   (5)、有两个变量:<br />      $ file1=this<br />      $ file2=that<br />      $ echo $file1and$file2   # Shell 会认为是查找变量 file1and 和变量 file2<br />      sh: file1and: parameter not set<br />      $ echo ${file1}and$file2   # 解决方案:用大括号界定变量名与其周围的文本<br />      thisandthat<br /><br />   (6)、用绝对路径名定义一个变量的值,通过使用该变量,可以在文件系统的任何位置访问目标文件或目录。<br /><br />   (7)、<span style='color:blue'>引号的作用</span>:<br />      $ cheyenne=2<br />      $ echo cheyenne   # 在屏幕上显示 cheyenne<br />      $ echo $cheyenne   # 在屏幕上显示 2<br />      $ echo “$cheyenne”   # 在屏幕上显示 2<br />      $ echo &#39;$cheyenne&#39;   # 在屏幕上显示 $cheyenne<br /><br />5、<b>命令替换</b>:同一个命令行中用一个命令的输出结果替换该命令。<br />   <span style='color:blue'>$ `command`</span><br />   常用于将一个命令的输出结果分配给一个变量,然后引用或控制该变量。<br />   [例]$ banner data<br />      $ banner `data`<br /><br />6、<b>波浪号替换</b>:<br />   - 若一个词以 ~ 开头,这个词会扩展这个波浪号。<br />   - 只能扩展位于单词开头的波浪号(/~home/cheyenne 不能扩展其中的波浪号)。<br />   - 单独的一个 ~ 或在 / 之前的 ~ : 用 $HOME 取代~。<br />   - ~+ : 用 $PWD 取代 ~(cd 命令将重设 PWD 的值)。<br />   - ~- : 用 $OLDPWD 取代 ~(cd 命令将重设 OLDPWD 的值)。<br />   - 若 ~ 后面紧跟几个字符,然后接一个 /,Shell 会核对这几个字符是否与某系统用户名匹配,若匹配,就用该用户名取代~。<br /><br />7、<b>显示变量的值</b>:<br />   $ env   # 显示在用户环境中定义的所有的变量的值<br />   $ set   # 显示在本地数据区和用户环境中当前定义的所有变量的值<br />   $ unset   # 删除指定变量的当前值(该变量的值将被指定为 NULL,此值有效)<br /><br />8、<b>将本地变量转移到用户环境中</b>:<br />   $ export variable<br />   $ export varibale=value   # 给变量赋值并转移<br />   $ export   # 显示所有被输出变量的名字及其值<br /><br />9、<b>向应用程序传递变量</b>:<br />   (1)、登录后,Shell 程序被载入内核执行。当在提示符下输入一个应用程序(或命令)的名字后,会创建一个子进程,并执行以下程序:<br />      - <span style='color:blue'>fork 程序</span>:复制 Shell 进程(包括程序代码、环境数据区和本地数据区)。<br />      - <span style='color:blue'>exec 程序</span>:将子进程的代码及本地数据区替换为请求执行的应用程序的代码及本地数据区。<br />      - 执行请求的应用程序后,exec 命令结束。<br /><br />   (2)、执行子进程时,Shell(父进程)会转入睡眠状态,等候子进程结束。一旦子进程结束,它将释放占用的内存,唤醒父进程,这个父进程时刻准备接受另一个命令执行请求。<br /><br />   (3)、<b>本地变量与环境变量</b>:<br />      - 定义新变量:此变量会被存储在与定义该变量的进程有关的本地数据区中。<br />      - 若要使任何一个子进程都能访问这个变量,必须用 <span style='color:blue'>export</span> 命令将其导出到用户环境中。<br />      - 一旦此变量处于用户环境中,后来运行的所有子进程都可以访问此变量(用户环境的内容向每一个子进程广播)。<br />      - 父 Shell 的环境变量不会被子进程修改。<br /><br />10、<b>监控进程</b>:<br />  <span style='color:blue'> $ ps [-f]</span>   # 显示当前运行(或处于睡眠状态)进程的信息<br />   包括 PID 及 PPID(PID:进程号,PPID:父进程号)。

2004-3-9 22:47 carol
--&#62; <span style='color:blue'>关于文件名</span>:<br /><br />1、<b>文件名生成的字符集</b>:<br />     <span style='color:purple'>?</span>   匹配任意单个字符(除用点开头的文件外)<br />     <span style='color:purple'>[]</span>    从将被匹配的字符里分类(除用点开头的文件外)<br />     <span style='color:purple'>*</span>    匹配零字符或更多的字符集(除用点开头的文件外)<br /><br />2、<b>点文件</b>:<br />    以点开头的文件在文件生成字符集里通常是隐藏的,文件名生成字符集永远也不会生成以点开头的文件名称。<br /><br />3、<b>三个通配符</b>:<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1-->&#91;例&#93; $ ls -a<br /> . &nbsp;.. &nbsp;.zz &nbsp;1G &nbsp;2G &nbsp;7G &nbsp;15G &nbsp;Ant &nbsp;Cat &nbsp;Dog &nbsp;abc &nbsp;abcdef &nbsp;ba &nbsp;cyz<br />$ echo &#91;abc&#93;?? &nbsp; &nbsp;# echo abc cyz<br />$ echo &#91;1-9&#93;&#91;A-Z&#93; &nbsp; &nbsp;# echo 1G 2G 7G<br />$ echo &#91;&#33;A-Z&#93;?? &nbsp; &nbsp;# echo 15G abc cyz<!--c2--></div><!--ec2--><br /><br /><span style='color:blue'>[注]叹号的作用是“非”的意思</span>

2004-3-9 22:52 carol
--&#62; <span style='color:blue'>引用:避免或删掉带有特殊意义的指定字符。</span><br /><br />1、引用字符:<span style='color:red'> \     ‘     “</span>单引号本身不能被引用<br /><br />2、\:删除下一个特殊字符的意义<br />反斜线总是屏蔽掉它后面一个字符的特殊意义(无论后面是什么字符)<br /><br />3、’:屏蔽掉所有包含在其中间的字符的特殊意义<br /><br />4、”:和单引号功能一样,但允许使用变量替换($)和命令替换(`)<br />如果要显示 $ 和 `,用 \ 来屏蔽。<br /><br />[例]<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--> <br />$ color=&#39;red white and blue&#39;<br />$ echo the value of \$color is $color<br />the value of $color is red white and blue<br />$ echo &#39;the value of \$color is $color&#39;<br />the value of \$color is $color<!--c2--></div><!--ec2--><br /><br /><span style='color:blue'>[注]所有引用机制只能在单行命令中使用</span>

2004-3-9 22:54 carol
--&#62; <b><span style='color:blue'>Shell 编程概述</span></b>:<br /><br />1、<b>Shell 程序(或叫 Shell 脚本):</b><br />- Shell 程序是按照一定的规则包含 UNIX 系统命令的文件。<br />- 要执行 Shell 程序,文件的权限至少是 r-x。<br />- 执行时,直接键入文件名。<br />- 可以传递给程序的数据:环境变量,命令行变量和用户输入的变量(read 命令)。<br /><br />2、编程<b>注意</b>事项:<br />- 建议加注释(# 后面的内容为注释)。<br />- 不要生成文件名为 test 的 Shell 程序(test 命令是系统用于建立 Shell 命令的命令)。<br />- export 命令的使用(本地变量 --&#62; 环境变量)。<br />- 子程序不能修改它上一级进程的环境变量。即使它对这个环境变量再次赋值,但在它的上一级进程里将不会受到影响。<br /><br />3、<b>Shell 程序中的参数</b>:<br />$ sh_program arg1 arg2 … argX<br />        $0    $1    $2  …  $x<br />- 作用:主要用于在应用程序中互相传递数据。<br />- $0,$1,…,$9,${10},${11},…<br />- $0 代表命令名(程序的名字)。

2004-3-9 22:56 carol
--&#62; <span style='color:blue'>特殊的 Shell 变量</span>:<br /><br />1、希望允许用户键入带有个数不定的参数,无论几个,程序都能正常运行。<br /><br />2、 <span style='color:blue'># 和 *</span> :<br />   $# -- 键入的命令行参数的个数<br />   $* -- 访问整个命令行参数列表(不包括 $0)<br /><br />3、若将整个参数串传递给一个命令时,这个命令必须支持多重参数。<br /><br />[例]<!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--># 此文件名为 example_01<br />echo &#34;there are $# command-line arguments.&#34;<br />echo &#34;they are $*.&#34;<br />echo &#34;the 1st command-line argument is $1.&#34;<br /><br />--------------------------------------------------------------<br />保存文件后执行以下命令:<br />$ chmod u+x example_01<br />$ example_01 cheyenne feming rayi nolwenn old_farmer<br /><br />--------------------------------------------------------------<br />运行结果:<br />there are 5 command-line arguments.<br />they are cheyenne feming rayi nolwenn old_farmer.<br />the 1st command-line argument is cheyenne.<!--c2--></div><!--ec2-->

2004-3-9 22:57 carol
未完待续~  <br /><br />转自 电脑爱好者俱乐部超酷论坛 <!--emo&:awkard:--><img src='style_emoticons/default/awkard.gif' border='0' style='vertical-align:middle' alt='awkard.gif' /><!--endemo-->

2004-3-10 03:30 Bell
Carol MM 把这个帖子转过来了啊 <!--emo&:awkard:--><img src='style_emoticons/default/awkard.gif' border='0' style='vertical-align:middle' alt='awkard.gif' /><!--endemo--> <br /><br />呵呵,这是我在联盟论坛上发的帖子,是教那里的新手的。这里恐怕没人需要这么基础的东西吧? <!--emo&:grin:--><img src='style_emoticons/default/grin.gif' border='0' style='vertical-align:middle' alt='grin.gif' /><!--endemo-->

2004-3-10 08:09 larryh
初学者还是挺多的。就是有经验的工程师,在最终用户那里做的可能很多都熟悉SHELL,但乙方的工程师大多数还需要学习<br /><br />转得好

2004-3-10 08:22 meteor06
shell 应用的好,会很方便<br />继续学习  <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->

2004-3-11 07:23 纳兰婷
看看

2004-3-11 13:50 gandalf
learning carefully...<br />thanks<br /><!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--> <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->

2004-3-14 22:03 carol
--&#62; <span style='color:blue'>shift 命令</span>:<br /><br />1、格式: <span style='color:blue'>shift [n]</span><br />重新指定命令行参数的位置属性,允许用户通过命令行参数增加位置参数。<br /><br />2、所有在 $* 字符里的参数左移 n 个位置,在 $# 里的递减 n 个。<br /><br />3、缺省的 n 值为1。<br /><br />4、对于参数0,shift 命令不起作用。<br /><br />5、<span style='color:blue'>主要作用</span>:<br />   - 访问一些组中的位置属性参数(比如一系列的 x,y 坐标)<br />   - 从一个命令行中去掉命令选项(比如选项在参数之前)<br /><br />[<span style='color:red'>注意</span>]做一次 shift 操作,命令行中被移动的参数就会相应的丢失。若还想在以后的程序中使用这些参数,必须要在 shift 操作前保存。

2004-5-12 00:18 workaholic
不错 <!--emo&:)--><img src='style_emoticons/default/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo-->

2004-6-30 19:47 风轻扬
收下了,谢谢斑竹。

2004-6-30 22:51 天使光环
Cheyenne,嗯。。。三军总司令<br />原来是这位仁兄写的。。。

2004-6-30 23:35 无双
是啊<br />很历害的

页: [1] 2
查看完整版本: Shell 编程基础[原创]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.