Shell程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第4章Linuxshell程序设计4.1shell概述4.1.1shell的特点和主要版本作为命令解释程序一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,支持函数模块,有自己的语法结构1.shell的特点☆组合新命令☆提供了文件名扩展字符☆直接使用shell的内置命令☆灵活地使用数据流☆结构化的程序模块☆在后台执行命令☆可配置的环境☆高级的命令语言2.shell的种类(1)Bourneshell(简称sh)(2)Cshell(简称csh)(3)Kornshell(简称ksh)(4)BourneAgainshell(即bash)4.1.2shell程序示例【例4.1】由三条简单命令组成的shell程序(文件名为ex1)。$catex1datepwdcd..【例4.2】带有控制结构的shell程序(文件名为ex2)。$catex2#!/bin/bash#Ifnoarguments,thenlistingthecurrentdirectory.#Otherwise,listingeachsubdirectory.iftest$#=0thenls.elseforidols-l$i|grep'^d'donefi4.1.3shell脚本的建立和执行1.shell脚本的建立2.执行shell脚本的方式执行shell脚本的方式基本上有三种:(1)输入定向到shell脚本$bash脚本名(2)以脚本名作为参数其一般形式是:$bash脚本名[参数]如果以目前shell(以·表示)执行一个shell脚本,则可以使用如下简便形式:$·脚本名[参数](3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。$chmoda+xex2$PATH=$PATH:.$ex2注意,此时该脚本所在的目录应被包含在命令搜索路径(PATH)中4.5shell特殊字符4.5.1通配符1.一般通配符*(星号),它匹配任意字符的0次或多次出现?(问号),它匹配任意一个字符[](一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符!(惊叹号),如果它紧跟在一对方括号的左方括号([)之后,则表示不在一对方括号中所列出的字符2.模式表达式——是那些包含一个或多个通配符的字*(模式表)——匹配给定模式表中“模式”的0次或多次出现,各模式之间以“|”分开(下同)+(模式表)——匹配给定模式表中“模式”的1次或多次出现?(模式表)——匹配模式表中任何一种“模式”的0次或1次出现@(模式表)——仅匹配模式表中给定“模式”的一次出现!(模式表)——除给定模式表中的一个“模式”之外,可以匹配其他任何东西4.5.2引号1.双引号由双引号括起来的字符(除$、倒引号(`)和反斜线(\)外)均作为普通字符对待。2.单引号由单引号括起来的字符都作为普通字符出现3.倒引号倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。倒引号还可以嵌套使用。但应注意,嵌套使用时内层的倒引号必须用反斜线(\)将其转义。4.5.3输入/输出重定向符自动打开三个标准文件,即标准输入文件(stdin),标准输出文件(stdout)和标准出错输出文件(stderr)。1.输入重定向符一般形式是:命令文件名如:$scorefile12.输出重定向符一般形式是:命令文件名如:$whoabc3.输出附加定向符一般形式是:命令文件名如:$ps-lpsfile输入和输出重新定向可以连在一起使用。例如:$wc-linfileoutfile4.5.4注释、管道线1.注释#!/bin/bash#Ifnoarguments,thenlistingthecurrentdirectory.#Otherwise,listingeachsubdirectory.2.管道线ls-l$HOME|wc–lls|grepm?.c|wc–l4.5.5命令执行操作符1.顺序执行在执行时,以分号隔开的各条命令从左到右依次执行pwd;who|wc-l;cd/usr/bin2.逻辑与命令1&&命令2其功能是,先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。3.逻辑或命令1||命令2其功能是,先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。4.5.6成组命令1.{}形式以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。${echo“UserReportfor`date`.”;who;}|pr使用花括号时在格式上应注意:左括号“{”后面应有一个空格;右括号“}”之前应有一个分号(;)2.()形式(echoCurrentdirectoryis`pwd`.cd/home/mengqc;ls-l;cpm1em1&&rmm1catem1)|pr二者存在重要区别:用花括号括起来的成组命令只是在本shell内执行命令表,不产生新的进程;而用圆括号括起来的成组命令是在新的子shell内执行,要建立新的子进程。4.6shell变量4.6.1用户定义的变量1.变量名是以字母或下线符打头的字母、数字和下线符序列,并且大小写字母意义不同。2.定义变量并赋值的一般形式是:变量名=字符串3.引用变量值在变量名前面加上一个符号“$”如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。$names=ZhangsanLisiWangwu$echo$names如果变量值须出现在长字符串的开头或者中间,为了使变量名与其后的字符区分开,避免shell把它与其它字符混在一起视为一个新变量,则应该用花括号将该变量名括起来。例如,$dir=/usr/meng$cat${dir}qc/m1.c4.命令替换有两种形式的命令替换:一种是使用倒引号引用命令,其一般形式是:`命令表`另一种形式是:$(命令表)如:$dir=$(pwd)$echo$(pwd;cd/home/mengqc;ls-d)4.6.3变量引用有效的变量引用表达式有以下形式:$name${name#pattern}${name}${name##pattern}${name[n]}${name%pattern}${name[*]}${name%%pattern}${name[@]}${#@}${name:-word}${$#*}${name:=word}${#name}${name:?word}${#name[*]}${name:+word}${#name[@]}①表达式$name表示变量name的值,若变量未定义,则用空值替换。②表达式${name}将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。③${name[n]}表示数组变量name中第n个元素的值。④表达式${name[*]}和${name[@]}都表示数组name中所有非空元素的值,每个元素的值用空格分开。如果用双引号把它们都括起来,那么二者的含义就有区别:对于${name[*]},它被扩展成一个词(即字符串),这个词由以空格分开的各个数组元素组成;对于${name[@]},它被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素,则${name[@]}被扩展为空串。⑤表达式${name:-word}、${name:=word}、${name:+word}、${name:?word}的计算方法在4.7节中介绍⑥表达式${name#pattern}和${name##pattern}如果pattern(Shell模式)与name值的开头匹配,那么name的值去掉匹配部分后的结果就是该表达式的值;否则,name的值就是该表达式的值。在第一种格式中,name值去掉的部分是与pattern匹配的最少的部分;而第二种格式中,name值去掉的部分是与pattern匹配的最多的部分。⑦表达式${name%pattern}和${name%%pattern}如果pattern与name值的末尾匹配,那么name的值中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。⑧表达式${#@}和${#*}它们的值分别是由$@和$*返回的参数的个数。⑨表达式${#name[i]}该表达式的值是数组name第i个元素值的长度(字符个数)。⑩表达式${#nane[*]}和${#name[@]}它们的值都是数组name中已经设置的元素的个数。4.6.4输入/输出命令1.read命令可以利用read命令从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是:read变量1[变量2…]变量个数与给定数据个数相同,则依次对应赋值变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据。变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串2.echo命令显示其后的变量值或者直接显示它后面的字符串如果echo命令带有选项“-e”,那么在其后的参数中可以有以下转义字符:\a\b\c\e\f\n\r\t\v\\\m\xm4.6.5位置参数1.位置参数及其引用位置变量的名称很特别,分别是0,1,2,…命令行实参与脚本中位置变量的对应关系如下所示:exam1m1m2m3m4$0$1$2$3$4$5$6$7$8$9${10}${11}引用它们的方式依次是$0,$1,$2,…,$9,${10},${11}等。其中,$0始终表示命令名或shell脚本名。▲位置变量不能通过一般赋值的方式直接赋值▲通过命令行上对应位置的实参传值4.6.6移动位置参数每执行一次shift命令,就把命令行上的实参向左移一位,即相当于位置参数向右移动一个位置。命令行:ex7ABCDEF原位置参数:$0$1$2$3$4$5$6移位后位置参数:$0$1$2$3$4$5shift命令不能将$0移走,所以经shift右移位置参数后,$0的值不会发生变化。shift命令可以带有一个整数作为参数4.6.7预先定义的特殊变量$#命令行上参数的个数,但不包含shell脚本名本身。因此,$#可以给出实际参数的个数。$?上一条命令执行后的返回值(也称作“返回码”、“退出状态”、“退出码”等)。它是一个十进制数。$$当前进程的进程号。$!上一个后台命令对应的进程号,这是一个由1~5位数字构成的数字串。$-由当前shell设置的执行标志名组成的字符串。$*表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。$@它与$*基本功能相同,即表示在命令行中给出的所有实参。但“$@”与“$*”不同。4.6.8环境变量1.常用的环境变量HOME:用户主目录的全路径名LOGNAME:即你的注册名,由Linux自动设置MAIL:你的系统信箱的路径PATH:shell从中查找命令的目录列表。可以设置它,如:PATH=$PATH:$HOME/binPS1:shell的主提示符。bash默认的主提示符一般为“\s-\v\$”。其中,\s表示shell的名称;\v表示bash的版本号PS1=EnterCommandPWD:你当前工作目录的路径SHELL:你当前使用的shellTERM:你的终端类型2.使用环境变量如果要使用环境变量或其它shell变量的值,必须在变量名之前加上一个“$”符号,不能直接使用变量名。如:cd$HOME3.删除环境变量$unsetNAME4.8算术运算bash中执行整数算术运算的命令是let,其语法格式为:letarg…其中arg是单独的算术表达式。它使用C语言中表达式的语法

1 / 46
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功