资源预览内容
第1页 / 共179页
第2页 / 共179页
第3页 / 共179页
第4页 / 共179页
第5页 / 共179页
第6页 / 共179页
第7页 / 共179页
第8页 / 共179页
第9页 / 共179页
第10页 / 共179页
亲,该文档总共179页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 Shell编程,7.1 Shell的基本概念 7.2 Shell语法 7.3 正则表达式 7.4 Shell编程综合实例 习题,7.1 Shell的基本概念,7.1.1 Shell的概念 Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。用户在提示符下输入的命令都由Shell解释后传给Linux核心。Shell、用户及Linux操作系统内核之间关系如图7-1所示。,图7-1 Shell、用户及Linux操作系统内核之间关系,有一些命令(比如改变工作目录命令cd)是包含在Shell内部的。还有一些命令(例如拷贝命令cp和移动命令rm)是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在Shell内部还是一个单独的程序。,Shell接到用户输入的命令后首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后,Shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。Shell对命令的解释过程如图7-2所示。,Shell的另一个重要特性是它自身就是一个解释型的程序设计语言。Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个执行的Shell程序中。,图7-2 Shell对命令的解释过程,当普通用户成功登录后,系统将执行一个称为Shell的程序。正是Shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 一旦出现了Shell提示符,就可以键入命令名称及命令所需要的参数。Shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以在键盘上按【Ctrl-d】发出中断信号来中断它(在正常结束之前,中止它的执行)。,当用户准备结束登录对话进程时,可以键入logout命令、exit命令或文件结束符(EOF)(按【Ctrl-d】实现),结束登录。 下面的例子显示了Shell如何来工作: rootredflag /root#cal 3 2003,三月 2003 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 rootredflag /root#,另外,用户键入有关命令后,如果Shell找不到以其中的命令名为名字的程序,就会给出错误信息。例如,如果用户键入: rootredflag /root#mytest bash:mytest:command not found 此时可以看到,用户得到了一个没有找到该命令的错误信息,这样的错误信息一般出现在用户输入错误命令时。,7.1.2 Shell的种类 Linux中的Shell有多种类型,其中最常见的是Bourne Shell (sh)、C Shell (csh)和Korn Shell (ksh)。三种Shell各有优缺点。Bourne Shell是Unix最初始的Shell,并且在每种Unix上都可以使用。Bourne Shell在Shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。Bash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。,C Shell是一种比Bourne Shell更适于编程的Shell,它的语法与C语言很相似。Linux为喜欢使用C Shell的人员提供了Tcsh。Tcsh是C Shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写矫正、历史命令替换、作业控制和类似C语言的语法,它提供比Bourne Shell更多的提示符参数。 Korn Shell集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。,Bash是大多数Linux系统(包括红旗Linux系统)的默认Shell。Bash有以下的优点: (1) 补全命令。当你在Bash命令提示符下输入命令或程序名时,你不必输全命令或程序名,按【Tab】键,Bash将自动补全命令或程序名。 (2) 通配符。在Bash下可以使用通配符“*”和“?”。“*”可以替代多个字符,而“?”则替代一个字符。,(3) 历史命令。Bash能自动跟踪用户每次输入的命令,并把输入的命令保存在历史列表缓冲区。缓冲区的大小由HISTSIZE变量控制。当用户每次登录后,home目录下的“.bash_history”文件将初始化历史列表缓冲区。也能通过history和fc命令执行、编辑历史命令。 (4) 别名。在Bash下,可用alias和unalias命令给命令或可执行程序起别名和清除别名,这样就可以用自己习惯的方式输入命令。,(5) 输入/输出重定向。输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是“”。,【实例7.1】 输入重定向: rootredflag /root#wcdir.out 上面命令将ls命令的输出保存为文件dir.out。 rootredflag /root#lsdir1.out,“”表示要将一条命令的输出结果追加到文件dir1.out的后面,该文件的原有内容不被破坏,如果使用“”,则文件原有内容被覆盖。 (6) 管道。管道用于将一系列的命令连接起来,也就是把前面命令的输出作为后面命令的输入。管道的命令是“|”。,【实例7.2】 rootredflag /root# cat dir.out|grep “test “|wc l 管道将cat命令(列出一个文件的内容)的输出送给grep命令,grep命令在输入里查找单词test,grep的输出则是所有包含单词test的行,这个输出又被送给wc命令,wc命令统计出输入中的行数。假设dir.out的内容如下:,This is a test. Today is Monday. Eveybody is here. We should have a test. The final test is over. 那么该管道运行的结果应该是3。,(7) 提示符。Bash有两级提示符。第一级提示符就是登录Shell时见到的,默认为“$”。可以通过重新给PS1变量赋值来改变第一级提示符。当Bash需要进一步提示以便补全命令时,它会显示第二级提示符。第二级提示符默认为“”,可以通过重新给PS2变量赋值来改变第二级提示符。一些特殊意义的字符也可以加入提示符赋值中。,(8) 作业控制。作业控制是指在一个作业执行过程中,控制执行的状态。可以挂起一个正在执行的进程,并在以后恢复执行该进程。按下【Ctrl-z】组合键,挂起正在执行的进程,用bg命令使进程恢复在后台执行,用fg命令使进程恢复在前台执行。 【技巧】 如何查看用户登录系统时默认使用的Shell?, 最简单的方式是执行echo命令,查询系统环境变量的值: rootredflag /root# echo $SHELL /bin/bash 执行finger命令查看用户数据,也能看到用户默认的Shell: rootredflag /root#finger l root Login: root Name: root Directory: /root Shell: /bin/bash,On since Fri Mar 7 08:14 (EST) on tty1 20 minutes 24 seconds idle On since Fri Mar 7 08:17 (EST) on tty2 16 minutes idle On since Fri Mar 7 08:14 (EST) on pts/0 20 minutes 6 seconds idle On since Fri Mar 7 08:19 (EST) on pts/1 from :0.0 No mail. Plan: listening ., 查看/etc/passwd文件,注意用“:”分隔的最后一列,就是该用户的默认的Shell,该文件的内容如下: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin: daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:/var/adm: lp:x:4:7:lp:/var/spool/lpd: rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/bin/false test:x:500:500:/home/test:/bin/bash,7.1.3 创建及执行Shell脚本 1. 创建Shell脚本文件 Shell脚本是指使用用户环境Shell提供的语法所编写的脚本。如果你经常用到相同执行顺序的操作命令,便可以将这些命令写成脚本文件,这样以后要做同样的事情时,只要在命令行输入其文件名即可。本节会以一个简单的实例,来介绍如何创建与执行Shell脚本。,【实例7.3】 该实例会显示当前的日期时间、执行路径、用户账号及所在的目录位置。 在文本编辑器中输入下列内容,并存为showinfo: #!/bin/bash #This script is a test! echo n “Date and time is: “ date,echo n “The Executable path is : “$PATH echo “Your name is : whoami “ echo n “Your Current directory is : “ pwd #end,2. 执行Shell脚本 编辑脚本之后,如何来运行呢?一般有四种方法,下面来分别介绍。 (1) 将脚本的权限设置为可执行,这样就可以在Shell的提示符下直接执行。可以使用 chmod命令更改Shell脚本的权限: chmod u+x showinfo chmod u+x,g+x showinfo chmod a+x showinfo,其中第一行是将用户自己的权限设置为可执行,第二行是将用户自己和同组的权限设置为可执行,第三行将所有人的权限设置为可执行,包括用户自己、同组用户和其他用户。 那么如何指定使用哪一个Shell来解释执行脚本呢? 如果Shell脚本的第一个非空白字符不是“#”,则它会使用Bourne Shell。 如果Shell脚本的第一个非空白字符是“#”,但不是以“#!”开头时,则它会使用C Shell。, 如果Shell脚本以“#!”开头,则“#!”后面所跟的字符串就是所使用Shell的绝对路径名。Bourne Shell的路径名称为/bin/sh,而C Shell则为/bin/csh。 (2) 执行Shell脚本想要执行的Shell,其后跟随Shell脚本的文件名作为
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号