shell编程基础.docx
《shell编程基础.docx》由会员分享,可在线阅读,更多相关《shell编程基础.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、linux系统下给命令指定别名alias命令用法:在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名。虽然可以为命令建立“链接”解决长文件名的问题,但对于带命令行参数的命令,链接就无能为力了。而指定别名则可以解决此类所有问题。只要举一些例子就可以了:alias l=ls -l ;用 l 代替 ls -l 命令(Xenix 下就有类似的 l 命令)alias cd.=cd . ;用 cd. 代替 cd . 命令(对在 DOS 下使用惯了 cd. 的人帮助很大)alias md=mkdir ;用 md 代替 mkdir 命令(对在 DOS 下)alias c:=moun
2、t /dev/hda1 /mnt/c & cd /mnt/c ;用 c: 命令代替命令序列:安装 DOS 分区,再进入。通常我们可以将以上命令放到自己的home目录下的.bash_prifle文件中,在使用source .bash_profile 命令.即可使用.Shell编程基础我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):# !/bin/sh注意:最好使用“!/bin/bash”而不是“!/bin/sh”,如果使用tc shell改为tcsh,其他类似。符号#!用来告诉系统执行该脚本的程序,本
3、例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:chmod +x filename此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。目录 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编
4、程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:1. 首个字符必须为字母(a-z,A-Z)2. 中间不能有空格,可以使用下划线(_)3. 不能使用标点符号4. 不能使用bash里的关键字(可用help命令查看保留关键字)需要给变量赋值时,可以这么写:变量名=值要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在=两边留空格 )#!/bin/sh# 对变量赋值:a=hello world #等号两边均不能有空格存在# 打印变量a的值:echo A is: $a挑个自己喜欢的编辑器,输入上述内容,并保存为文件first,然后执行 chmod +x firs
5、t 使其可执行,最后输入 ./first 执行该脚本。其输出结果如下:A is: 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 2nd需要注意shell的默认赋值是字符串赋值。比如:var=1var=$var+1echo
6、 $var打印出来的不是2而是11。为了达到我们想要的效果有以下几种表达方式:let var+=1var=$var+1var=expr $var + 1#注意加号两边的空格,否则还是按照字符串的方式赋值。注意:前两种方式在bash下有效,在sh下会出错。let表示数学运算,expr用于整数值运算,每一项用空格隔开,$将中括号内的表达式作为数学运算先计算结果再输出。Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。Shell
7、里的流程控制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语句:#!
8、/bin/shif $SHELL = /bin/bash ; then echo your login shell is the bash (bourne again shell)else echo your login shell is not bash but $SHELLfi变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。还可以使用 test 选项 文件名 来测试,而测试结果使用echo $?来查看选项有: -d -f -w -r -x -L数值测试的选项有: -eq = -ne -qt -lt -le =& 和
9、| 操作符熟悉C语言的朋友可能会喜欢下面的表达式: -f /etc/shadow & echo This computer uses shadow passwords这里的 & 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则打印”This computer uses shadow passwords”。同样shell编程中还可以用或操作(|),例如:#!/bin/shmailfolder=/var/spool/mail/james -r $mailfolder | echo Can not rea
10、d $mailfolder ; exit 1; echo $mailfolder has mail from:grep From $mailfolder该脚本首先判断mailfolder是否可读,如果可读则打印该文件中的From 一行。如果不可读则或操作生效,打印错误信息后脚本退出。需要注意的是,这里我们必须使用如下两个命令:-打印错误信息-退出程序我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用;普通函数稍后再作说明。即使不用与和或操作符,我们也可以用if表达式完成任何事情,但是使用与或操作符会更便利很多。case 语句case表达式可以用来匹配一个给定的字符串,而不是数字(
11、可别和C语言里的switch.case混淆)。case . in .) do something here ; ;esacfile命令可以辨别出一个给定文件的文件类型,如:file 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
12、 is differentcase $ftype in$1: Zip archive*) unzip $1 ;$1: gzip compressed*) gunzip $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的一
13、种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:select var in . ; dobreak;done. now $var can be used .下面是一个简单的示例:#!/bin/shecho What is your favourite OS?select var in Linux Gnu Hurd Free BSD Other; do break;doneecho You have selected $var如果以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:What is you
14、r favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have selected Linuxwhile/for 循环在shell中,可以使用如下循环:while .; do .done只要测试表达式条件为真,则while循环将一直运行。关键字break用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。for循环会查看一个字符串行表(字符串用空格分隔),并将其赋给一个变量:for var in .; do .done下面的示例会把A B C分别打印到屏幕上:#!/bin/shfor v
15、ar in A B C ; do echo var is $vardone下面是一个实用的脚本showrpm,其功能是打印一些RPM包的统计信息:#!/bin/sh# list a content summary of a number of RPM packages# USAGE: showrpm rpmfile1 rpmfile2 .# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpmfor rpmpackage in $*; do if -r $rpmpackage ;then echo = $rpmpackage = rpm -qi -p $rpmpa
16、ckage else echo ERROR: cannot read file $rpmpackage fidone这里出现了第二个特殊变量$*,该变量包含有输入的所有命令行参数值。如果你运行showrpm openssh.rpm w3m.rpm webgrep.rpm,那么 $* 就包含有 3 个字符串,即openssh.rpm, w3m.rpm和 webgrep.rpm。Shell里的一些特殊符号引号在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓的扩展是指程序会把通配符(比如*)替换成适当的文件名,把变量替换成变量值。我们可以使用引号来防止这种扩展,先来看一个例子,假设在当前目
17、录下有两个jpg文件:mail.jpg和tux.jpg。#!/bin/shecho *.jpg运行结果为:mail.jpg tux.jpg引号(单引号和双引号)可以防止通配符*的扩展:#!/bin/shecho *.jpgecho *.jpg其运行结果为:*.jpg*.jpg其中单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:#!/bin/shecho $SHELLecho $SHELLecho $SHELL运行结果为:/bin/bash/bin/bash$SHELL此外还有一种防止这种扩展的方法,即使用转义字符反斜杆::echo *.jpgecho $SH
18、ELL输出结果为:*.jpg$SHELLHere Document当要将几行文字传递给一个命令时,用here documents是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用here documents就不必用echo函数一行行输出。Here document以 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:#!/bin/sh# we have less than 3 arguments. Print the help text:if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell 编程 基础
限制150内