Linux Shell脚本编程基础.docx
《Linux Shell脚本编程基础.docx》由会员分享,可在线阅读,更多相关《Linux Shell脚本编程基础.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux Shell脚本编程基础本文作者:Leal授权许可: 创作共享协议 GNU自由文档许可证编辑者:谋万世全局者我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):#!/bin/sh注意:最好使用“!/bin/bash”而不是“!/bin/sh”,如果使用tc shell改为tcsh,其他类似。符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:chmod +x filename此后在该脚本所在目录下,输入 ./filename 即可
2、执行该脚本。目录 1 变量赋值和引用 2 Shell里的流程控制 o 2.1 if 语 句o 2.2 & 和 | 操作符o 2.3 case 语句o 2.4 select 语句o 2.5 while/for 循环 3 Shell里的一些特殊符号 o 3.1 引号 4 Here Document 5 Shell里的函数 6 Shell脚本示例 o 6.1 二进制到十进制的转换o 6.2 文件循环拷贝 7 脚本调试变量赋值和引用Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:1. 首个字符必须为字母(a-z,A-Z)2. 中间不能有空格,可以使用下划线(_)3. 不能使用标
3、点符号4. 不能使用bash里的关键字(可用help命令查看保留关键字)需要给变量赋值时,可以这么写:变量名=值要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在”=”两边留空格 )#!/bin/sh# 对变量赋值:a=”hello world” #等号两边均不能有空格存在# 打印变量a的值:echo “A is:” $a挑个自己喜欢的编辑器,输入上述内容,并保存为文件first,然后执行 chmod +x first 使其可执行,最后输入 ./first 执行该脚本。其输出结果如下:A is: hello world有时候变量名可能会和其它文字混淆,比如:nu
4、m=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 2nd注意花括号的位置:num=2echo “this is the $numnd”其输出结果为:this is the 2nd需要注意shell的默认赋值是字符串赋值。比如:var=1var=$var+1echo $var
5、打印出来的不是2而是11。为了达到我们想要的效果有以下几种表达方式:let “var+=1var=$var+1var=expr $var + 1#注意加号两边的空格,否则还是按照字符串的方式赋值。注意:前两种方式在bash下有效,在sh下会出错。let表示数学运算,expr用于整数值运算,每一项用空格隔开,$将中括号内的表达式作为数学运算先计算结果再输出。Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。Shell里的流程
6、控制if 语 句“if”表达式如果条件为真,则执行then后的部分:if .; then.elif .; then.else.fi大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等通常用” “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。 -f somefile :判断是否是一个文件 -x /bin/ls :判断/bin/ls是否存在并有可执行权限 -n $var :判断$var变量是否有值 $a = $b :判断$a和$b是否相等 执行man test可以查看所有测试表达式可以比较和判断的类型。下面是一个简单的if语句:#!/b
7、in/shif $SHELL = /bin/bash ; thenecho “your login shell is the bash (bourne again shell)”elseecho “your login shell is not bash but $SHELL”fi变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。& 和 | 操作符熟悉C语言的朋友可能会喜欢下面的表达式: -f /etc/shadow & echo “This computer uses shadow passwords”这里的 & 就是一
8、个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则 打印”This computer uses shadow passwords”。同样shell编程中还可以用或操作(|),例如:#!/bin/shmailfolder=/var/spool/mail/james -r $mailfolder | echo “Can not read $mailfolder”; exit 1; echo “$mailfolder has mail from:”grep “From ” $mailfolder该脚本首先判断ma
9、ilfolder是否可读,如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。需要注意的是,这里我们必须使用如下两个命令:-打印错误信息 -退出程序 我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用;普通函数稍后再作说明。即使不用与和或操作符,我们也可以用if表达式完成任何事情,但是使用与或操作符会更便利很多 。case 语句case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switchcase混淆)。case in) do something hereesacfile命令可以辨别出一个给定文件的文件类型,如:fil
10、e lf.gz,其输出结果为:lf.gz: gzip compressed data, deflated, original filename,last modified: Mon Aug 27 23:09:18 2001, os: Unix我们利用这点写了一个名为smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip 类型的压缩文件:#!/bin/shftype=file “$1 # Note and is differentcase “$ftype” in“$1: Zip archive”*)unzip “$1;“$1: gzip compressed”*)gunzip
11、“$1;“$1: bzip2 compressed”*)bunzip2 “$1;*) echo “File $1 can not be uncompressed with smartzip”;esac你可能注意到上面使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:smartzip articles.zip$1 就是字符串 articles.zip。select 语句 =select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:select var in ; dobreak;done. now $var can be u
12、sed .下面是一个简单的示例:#!/bin/shecho “What is your favourite OS?”select var in “Linux” “Gnu Hurd” “Free BSD” “Other”; dobreak;doneecho “You have selected $var”如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have sel
13、ected Linuxwhile/for 循环在shell中,可以使用如下循环:while ; do.done只要测试表达式条件为真,则while循环将一直运行。关键字”break”用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:for var in .; do.done下面的示例会把A B C分别打印到屏幕上:#!/bin/shfor var in A B C; doecho “var is $var”done下面是一个实用的脚本showrpm,其功能是打印一些RPM包的统计
14、信息:#!/bin/sh# list a content 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 $rpmpackage”fidone这里出现了第二个特殊变量$*,
15、该变量包含有输入的所有命令行参数值。如果你运行showrpm openssh.rpm w3m.rpm webgrep.rpm,那么 $* 就包含有 3 个字符串,即openssh.rpm, w3m.rpm和 webgrep.rpm。Shell里的一些特殊符号引号在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓的扩展是指程序会把通配符(比如*)替换成适当的文件名,把变量替换成变量值。我们可以使用引号来防止这种扩展,先来看一个例子,假设在当前目录下有两个jpg文件:mail.jpg和tux.jpg。#!/bin/shecho *.jpg运行结果为:mail.jpg tux.jpg引号(单
16、引号和双引号)可以防止通配符*的扩展:#!/bin/shecho “*.jpg”echo *.jpg其运行结果为:*.jpg*.jpg其中单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:#!/bin/shecho $SHELLecho “$SHELL”echo $SHELL运行结果为:/bin/bash/bin/bash$SHELL此外还有一种防止这种扩展的方法,即使用转义字符反斜杆::echo *.jpgecho $SHELL输出结果为:*.jpg$SHELLHere Document当要将几行文字传递给一个命令时,用here documents是一种不错
17、的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用here documents就不必用echo函数一行行输出。Here document以 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:#!/bin/sh# we have less than 3 arguments. Print the help text:if $# -lt 3 ; thencat HELPren renames a number of files using sed regula
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux Shell脚本编程基础 Shell 脚本 编程 基础
限制150内