Linux系统下Shell编程基础教程.pdf





《Linux系统下Shell编程基础教程.pdf》由会员分享,可在线阅读,更多相关《Linux系统下Shell编程基础教程.pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Dschool 开发者学院 http:/LinuxLinuxLinuxLinux 系统下系统下 ShellShellShellShell 编程基础教程编程基础教程我们可以使用任意一种文字编辑器,比如 gedit、kedit、emacs、vi 等来编写 shell 脚本,它必须以如下行开始(必须放在文件的第一行):#!/bin/bash.注意:最好使用“!/bin/bash”而不是“!/bin/sh”,如果使用 tc shell 改为 tcsh,其他类似。符号#!用来告诉系统执行该脚本的程序,本例使用/bin/bash。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:chmod+x fil
2、ename此后在该脚本所在目录下,输入./filename 即可执行该脚本。一、一、变量赋值和引用变量赋值和引用Shell 编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:1首个字符必须为字母(a-z,A-Z)或者_2中间不能有空格,可以使用下划线(_)3不能使用其他标点符号需要给变量赋值时,可以这么写:变量名=值要取用一个变量的值,只需在变量名前面加一个$(注意:给变量赋值的时候,不能在=两边留空格)#!/bin/bash#对变量赋值:Dschool 开发者学院 http:/a=hello world#等号两边均不能有空格存在#打印变量 a 的值:echo Ais:$a挑个自己
3、喜欢的编辑器,输入上述内容,并保存为文件 first,然后执行 chmod+x first 使其可执行,最后输入./first 执行该脚本。其输出结果如下:Ais:hello world有时候变量名可能会和其它文字混淆,比如:num=2echo this is the$numnd上述脚本并不会输出this is the 2nd而是this is the;这是由于 shell 会去搜索变量 numnd的值,而实际上这个变量此时并没有值。这时,我们可以用花括号来告诉 shell 要打印的是num 变量:num=2echo this is the$numnd其输出结果为:this is the 2n
4、d注意花括号的位置:num=2Dschool 开发者学院 http:/echo this is the$numnd其输出结果为:this is the 2nd需要注意 shell 的默认赋值是字符串赋值。比如:var=1var=$var+1echo$var打印出来的不是2而是11。为了达到我们想要的效果有以下几种表达方式:let var+=1var=$var+1(var+)var=$($var+1)var=$(expr$var+1)#不建议使用var=expr$var+1#强烈不建议使用,注意加号两边的空格,否则还是按照字符串的方式赋值,为 Esc 下方的,而不是单引号。注意:前2种方式在 b
5、ash 下有效,在 sh 下会出错。let 表示数学运算,expr 用于整数值运算,每一项用空格隔开,$将中括号内的表达式作为数学运算先计算结果再输出。Shell 脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通 shell 变量外,还有环境变量,即那些由 export 关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。二、二、ShellShellShellShell里的流程控制里的流程控制Dschool 开发者学院 http:/if if if if 语语 句句if表达式如果条件为真,则执行 then 后的部分:if.;then
6、.elif.;then.else.fi大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等通常用 来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。-f somefile :判断是否是一个文件-x/bin/ls :判断/bin/ls 是否存在并有可执行权限-n$var :判断$var 变量是否有值$a=$b :判断$a 和$b 是否相等执行 man test 可以查看所有测试表达式可以比较和判断的类型。下面是一个简单的 if 语句:#!/bin/bashif$SHELL=/bin/bash;thenecho your login she
7、ll is the bash(bourne again shell)elseecho your login shell is not bash but$SHELLfiDschool 开发者学院 http:/变量$SHELL包含有登录shell 的名称,我们拿它和/bin/bash进行比较以判断当前使用的 shell是否为 bash。三、三、&和和|操作符操作符熟悉 C 语言的朋友可能会喜欢下面的表达式:-f/etc/shadow&echo This computer uses shadow passwords这里的&就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑
8、运算里的与操作。上述脚本表示如果/etc/shadow 文件存在,则 打印“Thiscomputer uses shadow passwords”。同样 shell 编程中还可以用或操作(|),例如:#!/bin/bashmailfolder=/var/spool/mail/james-r$mailfolder|echo Can not read$mailfolder;exit 1;echo$mailfolder has mail from:grep From$mailfolder该脚本首先判断 mailfolder 是否可读,如果可读则打印该文件中的From 一行。如果不可读则或操作生效,打
9、印错误信息后脚本退出。需要注意的是,这里我们必须使用如下两个命令:-打印错误信息-退出程序我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用;普通函数稍后再作说明。即使不用与和或操作符,我们也可以用 if 表达式完成任何事情,但是使用与或操作符会更便利很多。casecasecasecase 语句语句case 表达式可以用来匹配一个给定的字符串,而不是数字(可别和 C 语言里的 switch.case混淆)。case.inDschool 开发者学院 http:/.)do something here;esacfile 命令可以辨别出一个给定文件的文件类型,如:file lf.gz,
10、其输出结果为:lf.gz:gzip compressed data,deflated,original filename,last modified:Mon Aug 27 23:09:18 2001,os:Unix我们利用这点写了一个名为 smartzip 的脚本,该脚本可以自动解压 bzip2,gzip 和 zip 类型的压缩文件:#!/bin/bashftype=$(file$1)case$ftype in$1:Zip archive*)unzip$1;$1:gzip compressed*)gunzip$1;$1:bzip2 compressed*)bunzip2$1;*)echo Fi
11、le$1 can not be uncompressed with smartzip;esac你可能注意到上面使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:Dschool 开发者学院 http:/smartzip articles.zip$1 就是字符串 articles.zip。selectselectselectselect 语句语句select 表达式是 bash 的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:select var in.;dobreak;done.now$var can be used.下面是一个简单的示例:
12、#!/bin/bashecho What is your favourite OS?select var in Linux Gnu Hurd Free BSD Other;dobreak;doneechoYouhave selected$var该脚本的运行结果如下:What is your favourite OS?1)LinuxDschool 开发者学院 http:/2)Gnu Hurd3)Free BSD4)Other#?1Youhave selected Linuxwhile/forwhile/forwhile/forwhile/for 循环循环在 shell 中,可以使用如下循环:wh
13、ile.;do.done只要测试表达式条件为真,则 while 循环将一直运行。关键字break用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。for 循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:for var in.;do.done下面的示例会把AB C 分别打印到屏幕上:#!/bin/bashfor var inAB C;doecho var is$varDschool 开发者学院 http:/done下面是一个实用的脚本 showrpm,其功能是打印一些 RPM 包的统计信息:#!/bin/bash#list a con
14、tent summary of a number of RPM packages#USAGE:showrpm rpmfile1 rpmfile2.#EXAMPLE:showrpm/cdrom/RedHat/RPMS/*.rpmfor rpmpackage in$;doif -r$rpmpackage;thenecho=$rpmpackage=rpm-qi-p$rpmpackageelseecho ERROR:cannot read file$rpmpackagefidone这里出现了第二个特殊变量$,该变量包含有输入的所有命令行参数值。如果你运行showrpm openssh.rpm w3m.
15、rpm webgrep.rpm,那么$(有引号)就包含有 3 个字符串,即 openssh.rpm,w3m.rpm 和 webgrep.rpm。$*的意思是差不多的。但是只有一个字串。如果不加引号,带空格的参数会被截断。四、四、ShellShellShellShell里的一些特殊符号里的一些特殊符号引号引号在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓的扩展是指程序会把通配符(比如*)替换成适当的文件名,把变量替换成变量值。我们可以使用引号来防止这种扩展,先来看一个例子,假设在当前目录下有两个 jpg 文件:mail.jpg 和 tux.jpg。Dschool 开发者学院 http
16、:/#!/bin/bashecho*.jpg运行结果为:mail.jpg tux.jpg引号(单引号和双引号)可以防止通配符*的扩展:#!/bin/bashecho*.jpgecho*.jpg其运行结果为:*.jpg*.jpg其中单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:#!/bin/bashDschool 开发者学院 http:/echo$SHELLecho$SHELLecho$SHELL运行结果为:/bin/bash/bin/bash$SHELL此外还有一种防止这种扩展的方法,即使用转义字符反斜杆::echo*.jpgecho$SHELL输出结果为
17、:*.jpg$SHELL五、五、HereHereHereHere DocumentDocumentDocumentDocument当要将几行文字传递给一个命令时,用 here document 是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用 here document 就不必用 echo 函数一行行输出。Here document 以 开头,后面接上一个字符串,这个字符串还必须出现在 here documentDschool 开发者学院 http:/的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用 here document打印帮助:#!/bin/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统 Shell 编程 基础教程

限制150内