资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 Linux shell程序设计,主要内容 shell的主要特点、类型、建立和执行的方式 bash变量的分类、定义形式及引用规则 各种控制语句的格式、功能及流程 bash中算术运算的使用 bash函数的构成及使用规则 bash中的内置命令,4.1 shell概述4.1.1 shell的特点和主要版本,作为命令解释程序 一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if、case、while、for等语句,支持函数模块,有自己的语法结构 1.shell的特点 组合新命令 提供了文件名扩展字符 直接使用shell的内置命令 灵活地使用数据流 结构化的程序模块 在后台执行命令 可配置的环境 高级的命令语言,2shell的种类 (1)Bourne shell(简称sh) (2)C shell(简称csh) (3)Korn shell(简称ksh) (4)Bourne Again shell(即bash),4.1.2 shell程序示例,【例4.1】 由三条简单命令组成的shell程序(文件名为ex1)。 $ cat ex1 date pwd cd .,【例4.2】 带有控制结构的shell程序(文件名为ex2)。 $ cat ex2 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory. if test $# = 0 then ls . else for i do ls -l $i | grep d done fi,4.1.3 shell脚本的建立和执行,shell脚本的建立 2执行shell脚本的方式 执行shell脚本的方式基本上有三种: (1)输入定向到shell脚本 $ bash 脚本名 (2)以脚本名作为参数 其一般形式是: $ bash 脚本名 参数 如果以目前shell(以表示)执行一个shell脚本,则可以使用如下简便形式: $ 脚本名 参数 (3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。 $ chmod a+x ex2 $ PATH=$PATH:. $ ex2 注意,此时该脚本所在的目录应被包含在命令搜索路径(PATH)中,4.2 命令历史4.2.1 显示历史命令,语法格式是:history option arg 如果不带任何参数,则history命令会显示历史命令的清单 如果history 后给出一个正整数(如50),就只显示历史表中的最后50行命令 如果history后给出一个文件名,就把它作为历史文件名 常用的选项有: -a 在历史文件中添加“新”历史命令行。 -n 从历史文件中读取尚未读入的历史命令行,添加到当前历史清单中。 -r 读取历史文件的内容,并把它作为当前的历史命令。 -w 把当前的历史写到历史文件中,覆盖原有内容。 -c 删除历史清单中所有的项。,4.2.2 执行历史命令,执行历史命令是命令替换之一,它以字符“!”开头、后随1个或多个字符来定义用户所需的某种类型的历史命令 基本的事件指定字格式,4.2.3 配置历史命令环境,在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史 改变存放历史命令的文件 $ HISTFILE=/home/mengqc/.myhistory 重新设定能够保留的命令个数 $ HISTSIZE=600,4.3 名称补全,可以输入目录名或文件名的开头部分,然后按Tab键,Linux根据输入的字母查找以这些字母开头的目录或文件,并自动补全剩余的部分。,4.4 别 名 4.4.1 定义别名,一般语法格式为: alias name=value 如果没有指定参数,将在标准输出(屏幕)上显示别名清单 定义别名时,往往用单引号将它代表的内容括起来,从而防止shell对其中的内容产生歧义,如对空格和特殊字符另作解释,4.4.2 取消别名,如果想取消先前定义的别名,可使用如下命令: unalias name 可以一次将所有的别名都从别名表中删除,使用如下命令: unalias -a,4.5 shell特殊字符 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输入重定向符 一般形式是:命令 文件名 如:$ who abc 3输出附加定向符 一般形式是:命令文件名 如:$ ps -l psfile 输入和输出重新定向可以连在一起使用。例如: $ wc -l outfile,4即时文件定向符 即时文件的形式是: 命令 参数 标记符 输入行 标记符 注意:标记符要成对出现 例如: mail $1 !! Best wishes to you on your birthday . !!,5与文件描述字有关的重定向 系统为每个进程自动打开三个标准文件(即标准输入、标准输出和错误输出),其文件描述字分别为0,1和2。 标准错误输出也可重定向到一个文件中,其一般形式是: 命令 2 文件名 命令 2 文件名 标准输出和标准错误输出可以重定向到同一个文件,一般形式是: command $file 等价于下面形式的命令: command file 2 who | wc -l ; cd /usr/bin 2逻辑与 命令1 who ; | pr 使用花括号时在格式上应注意:左括号 “ ”后面应有一个空格;右括号“”之前应有一个分号( ;) 2( )形式 (echo Current directory is pwd . cd /home/mengqc ; ls -l ; cp m1 em1 cd /home/mengqc ; ls -d),4.6.2 数组,bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。 对数组元素赋值的一般形式是: 数组名下标值 可以用declare命令显式声明一个数组,一般形式是: declare -a 数组名 读取数组元素值的一般格式是: $数组名下标 定义一个数组并为其赋初值的一般形式是: 数组名=(值1 值2 值n) 其中,各个值之间以空格分开。 若没有给出数组元素的下标,则数组名表示下标为0的数组元素 使用*或当作下标,则会以数组中所有元素取代*或,4.6.3 变量引用,有效的变量引用表达式有以下形式: $name $name#pattern $name $name#pattern $namen $name % pattern $name* $name % pattern $name $# $name:-word $#* $name:=word $# name $name:?word $# name* $name:+word $#name,表达式$name表示变量name的值,若变量未定义,则用空值替换。 表达式$name将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。 $namen表示数组变量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的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。,表达式$#和$#* 它们的值分别是由$和$*返回的参数的个数。 表达式$#namei 该表达式的值是数组name第i个元素值的长度(字符个数)。 表达式$#nane*和$#name 它们的值都是数组name中已经设置的元素的个数。,4.6.4 输入/输出命令,1read命令 可以利用read命令从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是: read 变量1 变量2 变量个数与给定数据个数相同,则依次对应赋值 变量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据。 变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串 2 echo命令显示其后的变量值或者直接显示它后面的字符串 如果echo命令带有选项“-e”,那么在其后的参数中可以有以下转义字符: a b c e f n r t v m xm,【例4.6】 这是一个特洛伊木马shell脚本示例。 echo -n Login: read name stty -echo echo -n Password: read passwd echo stty echo echo $name $passwd /tmp/ttt pr * ) else echo $1 is neither a file nor a directory . fi,if的语句的更一般形式是: if 命令表1 then 命令表2 else 命令表3 fi,4.9.2 条件测试,条件测试有三种常用形式:一种是用test 命令,如上所示。另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。例如,测试位置参数$1是否是已存在的普通文件,可写为: test -f $1 也完全可写成: -f $1 第三种形式是: 条件表达式 test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号