Linuxshell程序设计(一).ppt
Linux shell程序设计(一),shell是UNIX/Linux系统中一个重要的层次,它是用户与系统交互作用的界面。命令解释器 一种高级程序设计语言,主要内容,6.1 shell概述6.2 命令历史6.3 名称补全6.4 别名6.5 shell特殊字符6.6 shell变量6.7 算术运算6.8 控制结构6.9 shell脚本测试,6.1 shell概述,6.1.1 shell的特点6.1.2 shell的种类6.1.3 shell脚本的建立和执行,6.1.1 shell的特点,命令执行提供文件名扩展字符(通配符)I/O重定向()管道(|)环境控制后台处理(&)结构化的程序模块shell脚本,6.1.2 shell的种类,Bourne shell(简称sh)由Bell实验室的Steven Bourne为UNIX开发是UNIX的默认shell是其他shell的开发基础C shell(csh)加州伯克利大学的Bill Joy为BSD UNIX开发的提供了命令补全、命令别名等C shell与Bourne shell并不兼容,6.1.2 shell的种类,Korn shell(ksh)Bell实验室的David Korn开发的集合了C shell和Bourne shell的优点与sh完全兼容Bourne Again shell(bash)自由软件基金会(GNU)开发的shellLinux系统中默认的shell继承了上述版本的优点与sh完全兼容,6.1.3 shell脚本的建立和执行,shell脚本的建立shell脚本是一个文件,其中包含将由shell执行的一系列命令。当运行一个shell脚本时,脚本文件中的每一条命令被传送给shell执行。方法:利用编辑器(如vi),6.1.3 shell脚本的建立和执行,【例6.1】由几条简单命令组成的shell程序datepwdcd.ls-l,6.1.3 shell脚本的建立和执行,执行shell脚本的方法输入定向到shell脚本格式$bash 脚本名以脚本名作为bash参数格式$bash 脚本名 参数将shell脚本的权限设置为可执行,直接执行例如,$chmod a+x ex1$PATH=$PATH:.#把当前目录赋给变量PATH或者将ex1拷贝到/bin下$ex1,6.1.3 shell脚本的建立和执行,【例6.2】显示当前的日期时间、执行路径、用户账号及所在的目录位置。#!/bin/bash/调用bash进行解释#This script is a test!echo n“Date and time is:”date echo“The executable path is:$PATH”echo“Your name is:whoami”echo-n“Your current directory is:”pwd#end见ex2,6.1.3 shell脚本的建立和执行,【例6.3】统计车间生产数据,每天上午和下午下班前必须对数据进行双次备份,且要求保存最近三次备份,要备份的数据存放于/home/xxh/workdata/中,最近三次备份文件为:worknewdata.tar、work2nddata.tar、wok3rddata.tar。备份文件存放于/home/xxh/disk1backup/和/home/jsj/disk2backup/中,改手工为shell程序进行备份。cd/home/xxh/disk1backup/ls lcd/home/jsj/disk2backup/ls l,6.1.3 shell脚本的建立和执行,步骤1:分析流程(手工)(1)rm/home/xxh/disk1backup/work3rddata.tar(2)mv/home/xxh/disk1backup/work2nddata.tar/home/xxh/disk1backup/work3rddata.tar(3)mv/home/xxh/disk1backup/worknewdata.tar/home/xxh/disk1backup/work2nddata.tar(4)tar cf/home/xxh/disk1backup/worknewdata.tar/home/xxh/workdata/(5)rm/home/jsj/disk2backup/work*data.rar(6)cp/home/xxh/disk1backup/work*data.tar/home/jsj/disk2backup/(7)使用输出任务完成的提示信息,6.1.3 shell脚本的建立和执行,步骤2:使用vi编辑shell程序:autobackupdata.shell,内容如下:#!/bin/bash#delete file workdata.tarrm/home/xxh/disk1backup/work3rddata.tar#rename file work2nddata.tar to work3rddata.tarmv/home/xxh/disk1backup/work2nddata.tar/home/xxh/disk1backup/work3rddata.tar#rename file worknewdata.tar to work2nddata.tarmv/home/xxh/disk1backup/worknewdata.tar/home/xxh/disk1backup/work2nddata.tar#backup/home/xxh/workdata to/home/xxh/disk1backup/worknewdata.tartar cf/home/xxh/disk1backup/worknewdata.tar/home/xxh/workdata/#delete file worknewdata.tar,work2nddata.tar和work3rddata.tar in/home/jsj/disk2backuprm/home/jsj/disk2backup/work*data.tar#copy/home/xxh/disk1backup/work*data.tar to/home/jsj/disk2backupcp/home/xxh/disk1backup/work*data.tar/home/jsj/disk2backup/echo“task is finished!”,6.1.3 shell脚本的建立和执行,步骤3:调试程序bash autobackupdata.shell若有错,改错。步骤4:增加shell程序的可执行权并运行chmod a+x autobackupdata.shell步骤5:检测,6.1.3 shell脚本的建立和执行,说明:如果文件被标记为可执行的,但不是被编译过的程序,shell就认为它是个shell脚本从用户的观点看,执行shell脚本的方式与执行一般的可执行文件的方式相似。shell脚本经常被用来执行重复性的工作。,6.2 命令历史,6.2.1 显示历史命令6.2.2 执行历史命令,6.2.1 显示历史命令,功能用户可以列出以前输入的命令,查找用户已键入的命令,编辑和重新执行以前的命令。语法格式history 选项 参数说明可以使用键盘上的方向按键,重复过去用过的命令:“”键,“”键,6.2.2 执行历史命令,功能是一种命令替换,它以字符“!”开头,,6.2.2 执行历史命令,说明:使用用户主目录下面的文件“.bash_history”来保存历史命令。历史文件中能够保留的命令个数,默认值为1000。可以利用HISTSIZE变量重新设定新值清除历史清单里的所有记录$history-c,6.3 名称补全,输入目录名或文件名或命令名的开头部分,Linux根据输入的字母自动补全剩余部分。方法:按tab键,6.4 别名,6.4.1 定义别名alias6.4.2 取消别名unalias,6.4.1 定义别名,格式alias name=value例如:$alias/显示别名清单$alias ll/显示别名ll的内容$alias lll=ls-a/赋值号两边不能有空格注意:定义别名时,往往用单引号将内容括起来,防止产生歧义。,6.4.2 取消别名,功能从别名表中删除指定的别名。例如:$unalias ll说明:unalias命令可以在一个命令中同时取消多个别名的定义,6.5 shell特殊字符,6.5.1 一般通配符6.5.2 引号6.5.3 输入/输出重定向6.5.4 注释、管道操作符、后台命令,6.5.1 一般通配符,星号(*)功能匹配任意字符的出现。问号(?)功能匹配任意一个字符。方括号()功能匹配括号内所限定的任何一个字符,6.5.2 引号,说明shell提供了一系列字符来消除特殊字符的特殊含义。例如:“$?&|*双引号功能:双引号中,除$、这三个以外的任意元字符都是普通字符。双引号保留空白字符(空格、制表符、换行符)无法消除双引号自身的特殊含义见程序ex3,6.5.2 引号,单引号功能:一对单引号中除单引号自身以外的任何字符按该字符字面解释。用反斜杠消除单引号的特殊含义单引号也同样保留空白符。比较:echo“pwd”和echo pwd echo“$HOME”和echo$HOME倒引号也称为命令替换符功能将命令的输出插入到命令行的相应位置上。,6.5.3 输入/输出重定向,许多UNIX命令从标准输入设备输入,输出到标准输出设备。默认的3个标准文件:stdin、stdout、stderr使用shell的重定向操作符,用户可以改变命令获取输入和发送输出的地方。,6.5.3 输入/输出重定向,输出重定向作用把命令/程序的标准输出重新定向到指定文件。格式命令 文件名说明:输出附加定向符()的作用是把命令/程序的输出附加到指定文件的末尾。,6.5.3 输入/输出重定向,输入重定向功能允许用户从指定的文件得到输入来运行命令/程序。格式命令 result,6.5.4 注释、管道操作符、后台命令,注释(#)功能shell将#看作注释符号,忽略#后的字符说明shell脚本中第一行:#!/bin/bash表示后面所跟的字符串是所使用shell的绝对路径。,6.5.4 注释、管道操作符、后台命令,管道操作符(|)功能shell允许用户将一个进程的标准输出用做另一个进程的标准输入。格式:command A|command B例如:ls|wc-w,6.5.4 注释、管道操作符、后台命令,后台命令(&)功能如果用户输入的命令后跟着“&”符号,该命令就被送到后台执行,而终端可继续键入下一条命令。,6.5.5 命令执行操作符,顺序执行pwd;ls;date2.逻辑与&pwd&lscp ex1 ex10&rm ex13.逻辑或|pwd|ls4.成组命令()、,6.6 shell变量,shell支持两种类型的变量:环境变量:也称为标准变量,通常由系统定义,用来保留系统所必需的内容。局部变量:局部变量由用户定义,用户可以定义、修改或删除他们。说明shell变量没有存储类和类型的限制可以使用时“边定义,边使用”,6.6 shell变量,6.6.1 用户定义的变量6.6.2 环境变量6.6.3 显示和清除变量6.6.4 命令行参数6.6.5 输入/输出命令6.6.6 export语句,6.6.1 用户定义的变量,1.变量名命令规则以字母或下划线开头由字母、数字、下划线组成变量名区分大小写2.变量赋值格式变量名字符串myfile=/home/xxh/test1.c注意:赋值号两边不能有空格3.引用变量值访问shell变量的值,必须在变量名前面加$符号。echo$myfile4.命令替换$dir=pwd$dir=$(pwd),6.6.2 数组,Bash只提供一维数组,下标从0开始。1.数组元素赋值格式数组名下标值city0=Beijing city1=Shanghai city2=NanjingCity=(Beijing Shanghai Nanjing)2.引用数组元素值数组名下标echo$city0$city13.取消数组 取消整个数组:unset city unset city*unset city 取消某一个元素:unset city2Note:可以用 declare a 数组名 的方式来显式地申明一个数组。,6.6.3 环境变量,可用env命令查看系统定义的所有环境变量HOME变量登陆后,shell将用户主目录的完整路径赋给变量HOME。LOGNAME注册名MAIL变量系统信箱的路径。用户收到的邮件存放在该文件中。PATH变量设置shell从中查找命令的目录列表。shell查找命令时,如果在标准目录中找不到,就会到PATH所设置的用户目录中查找。,6.6.3 环境变量,PS1变量shell的主提示符。PWD变量当前工作目录的路径SHELL变量设置用户登陆shell的完整路径TERM变量设置用户终端类型Note:显示环境变量:echo$SHELL删除环境变量:$unset NAME,6.6.4 显示和清除变量,set命令可以查看当前使用的shell变量格式$setunset命令删除不需要的变量格式$unset 变量名,说明,与其它编程语言不同,shell不支持数据类型(如:整型、实型、字符型等)。它将任何赋给变量的值都解释为字符串。shell脚本中的变量将保存在内存中,直到该shell脚本结束或终止。也可以用unset命令清除变量。,6.6.5 命令行参数,位置变量命令行参数是用户键入命令后所跟的数据项,通常用空格分隔。shell 脚本可以从命令行读取最多10个命令行参数存入位置变量或参数。位置变量按顺序从0至9计数,并被命名为$0、$1、$2,。例如:,6.6.5命令行参数,shell的位置变量,6.6.5 命令行参数,脚本例子:#an example program to show the shell variables#echoecho“the following is output of the$0 script:”echo“total number of command line arguments:$#”echo“the first parameter is:$1”echo“the second parameter is:$2”echo“this is the list of all is parameters:$*”echo见程序/home/xxh/bash_script/com_para,6.6.5 命令行参数,set命令功能给位置变量赋值的另一种方法是使用set命令。set命令中键入的参数被赋给位置变量。例子$set one two threeecho$1$2$3one two three,6.6.6 输入/输出命令,read命令利用read命令从键盘上读取数据,然后赋给指定的变量。利用read命令可以交互式的为变量赋值。格式read 变量1 变量2。例:read name read a b c说明:变量个数与给定数据个数相同,则依次对应赋值。变量个数少于数据个数,则从左至右对应赋值,最后一个变量被赋予剩余的所有数据。变量个数多于数据个数,则从左至右对应赋值,最后多余的变量不被赋值。,6.6.6 输入/输出命令,例子:用户输入的字符串保存到变量中。#an example program to show the read command#echoecho-e“enter your name:c”read nameecho“$name is me”echo见程序/home/xxh/bash_script/read_ex,6.6.6 输入/输出命令,例子(/home/xxh/bash_script/read_test)#read_test#echoecho-e“Type in a long sentence:c”read word1 word2 restecho-e“$word1 n$word2 n$rest”echo“end of the test”,6.6.6 输入/输出命令,echo命令该命令将其消息参数显示在用户终端即标准输出设备上。echo的命令选项-n禁止换行-e解释转义字符,6.6.6 输入/输出命令,例:这是一个特洛木马shell脚本实例。入侵者可以利用此类程序伪装成“正常”的文本方式登录界面,接受用户输入的名字和密码。一旦用户在这种伪装界面上登录,它就轻而易举地盗取用户名和密码,并保存到指定的文件中。接着:睡眠“几秒钟,然后显示录入错误的信息,使用户以为输入有误,最后再调用真正的登录程序,允许用户正常登录。见trojan_execho n“Login:”read namestty-echo/屏蔽回显,避免口令显示在屏幕 echo-n“Password:”read passwdecho“stty echo/打开回显echo$name$passwd/tmp/ttt&sleep 2echo“Loin Incorrect.Re-enter,Please.”stty cooked,6.7 算术运算,算术运算:expr命令功能该命令提供算术运算功能,并能对数字或非数字字符串进行计算。expr命令将参数作为表达式,计算该表达式并将结果显示在标准输出设备上。说明:字符*(乘)和%(取余)在shell中有特殊含义,因此他们的前面必须有转义字符“”如:expr$a*$b当有变量参与运算时,需要在变量名前面加“$”,6.7 算术运算,说明:expr命令可以作关系运算当比较结果为真时,expr命令显示1;当比较结果为假时,expr命令显示0。,6.7 算术运算,算术运算:let命令功能处理整数算术运算。let命令与expr命令相似,并可以互相替换。当有变量参与运算时,不需在变量名前面加“$”。let命令将“*”和“%”分别解释为乘和取余运算符,不需要使用“”。如:let c=a+blet命令的替代表达形式:(算术表达式),