Linux课程介绍-第四章.ppt

上传人:本田雅阁 文档编号:3482391 上传时间:2019-09-01 格式:PPT 页数:83 大小:673.52KB
返回 下载 相关 举报
Linux课程介绍-第四章.ppt_第1页
第1页 / 共83页
Linux课程介绍-第四章.ppt_第2页
第2页 / 共83页
Linux课程介绍-第四章.ppt_第3页
第3页 / 共83页
Linux课程介绍-第四章.ppt_第4页
第4页 / 共83页
Linux课程介绍-第四章.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《Linux课程介绍-第四章.ppt》由会员分享,可在线阅读,更多相关《Linux课程介绍-第四章.ppt(83页珍藏版)》请在三一文库上搜索。

1、2010年秋季,北京理工大学珠海学院计算机学院,Linux系统管理与应用,计算机科学教研室 主讲:胡敬朋,本章教学安排,一、教学目的、要求: 本章要求掌握Linux下shell的使用方法。主要介绍Linux shell的语法结构、变量定义以及赋值引用、标点符号、控制语句等。 二、教学内容 第1节 shell概述 第9节 控制结构 第2节 命令历史 第10节 函数 第3节 名称补全 第11节 作业控制 第4节 别名 第12节 shell内置命令 第5节 shell特殊字符 第13节 shell脚本调试 第6节 shell变量 第7节 参数置换变量 第8节 算术运算,三、重点内容 shell的主要

2、特点、类型、建立和执行的方式 bash变量的分类、定义形式及引用规则 各种控制语句的格式、功能及流程 bash中算术运算的使用 bash函数的构成及使用规则 bash中的内置命令 采用图表和板书重点讲解,第四章 Linux Shell程序设计,第1节 shell概述 第9节 控制结构 第2节 命令历史 第10节 函数 第3节 名称补全 第11节 作业控制 第4节 别名 第12节 shell内置命令 第5节 shell特殊字符 第13节 shell脚本调试 第6节 shell变量 第7节 参数置换变量 第8节 算术运算,4.1 shell 概述,4.1.1 shell的特点和主要版本 4.1.2

3、 shell程序示例 4.1.3 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 she

4、ll(即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.

5、1.3 shell脚本的建立和执行,1、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显示历史命令

6、 4.2.2执行历史命令 4.2.3配置历史命令环境,4.2.1 显示历史命令,语法格式是:history option arg 如果不带任何参数,则history命令会显示历史命令的清单 如果history 后给出一个正整数(如50),就只显示历史表中的最后50行命令 如果history后给出一个文件名,就把它作为历史文件名 常用的选项有: -a 在历史文件中添加“新”历史命令行。 -n 从历史文件中读取尚未读入的历史命令行,添加到当前历史清单中。 -r 读取历史文件的内容,并把它作为当前的历史命令。 -w 把当前的历史写到历史文件中,覆盖原有内容。 -c 删除历史清单中所有的项。,4.2.

7、2 执行历史命令,执行历史命令是命令替换之一,它以字符“!”开头、后随1个或多个字符来定义用户所需的某种类型的历史命令 基本的事件指定字格式,4.2.3 配置历史命令环境,在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史 改变存放历史命令的文件 $ HISTFILE=“/home/mengqc/.myhistory“ 重新设定能够保留的命令个数 $ HISTSIZE=600,4.3 名称补全,可以输入目录名或文件名的开头部分,然后按Tab键,Linux根据输入的字母查找以这些字母开头的目录或文件,并自动补全剩余的部分。,4.4 别 名,4.4.1 定义

8、别名 4.4.2 取消别名,4.4.1 定义别名,一般语法格式为: alias name=value 如果没有指定参数,将在标准输出(屏幕)上显示别名清单 定义别名时,往往用单引号将它代表的内容括起来,从而防止shell对其中的内容产生歧义,如对空格和特殊字符另作解释,4.4.2 取消别名,如果想取消先前定义的别名,可使用如下命令: unalias name 可以一次将所有的别名都从别名表中删除,使用如下命令: unalias -a,4.5 shell特殊字符,4.5.1 通配符 4.5.2 引号 4.5.3 输入/输出重定向符 4.5.4 注释、管道线和后台命令 4.5.5 命令执行操作符

9、4.5.6 成组命令,4.5.1 通配符,1一般通配符 *(星号),它匹配任意字符的0次或多次出现,不能匹配文件名前面的.和/ ?(问号),它匹配任意一个字符 (一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符 !(惊叹号),如果它紧跟在一对方括号的左方括号()之后,则表示不在一对方括号中所列出的字符 例:chapter0-9*,-a*?abc, f!1-9.c 2模式表达式 是那些包含一个或多个通配符的字 *(模式表)匹配给定模式表中“模式”的0次或多次出现,各模式之间以“”分开(下同) +(模式表)匹配给定模式表中“模式”的1次或多次出现 ?(模式表)匹配模式表中任

10、何一种“模式”的0次或1次出现 (模式表)仅匹配模式表中给定“模式”的一次出现 !(模式表)除给定模式表中的一个“模式”之外,可以匹配其他任何东西 例:file*(.c|.o),file+(.c|.o) ),file?(.c|.o) ),file(.c|.o),4.5.2 引号,1双引号 由双引号括起来的字符(除$、倒引号()和反斜线()外)均作为普通字符对待。 2单引号 由单引号括起来的字符都作为普通字符出现 3倒引号 倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。 倒引号还可以嵌套使用。但应注意,嵌套使用时内层的

11、倒引号必须用反斜线()将其转义。,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

12、 . !!,5与文件描述字有关的重定向 系统为每个进程自动打开三个标准文件(即标准输入、标准输出和错误输出),其文件描述字分别为0,1和2。 标准错误输出也可重定向到一个文件中,其一般形式是: 命令 2 文件名 命令 2 文件名 标准输出和标准错误输出可以重定向到同一个文件,一般形式是: command $file 等价于下面形式的命令: command file 2& 1,4.5.4 注释、管道线和后台命令,1注释 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing e

13、ach subdirectory. 2管道线 ls -l $HOME | wc l ls | grep m?.c | wc l 3后台命令 $ gcc m1.c&,4.5.5 命令执行操作符,1顺序执行 在执行时,以分号隔开的各条命令从左到右依次执行 pwd ; who | wc -l ; cd /usr/bin 2逻辑与 命令1 & 命令2 其功能是,先执行命令1,如果执行成功,才执行命令2;否则,若命令1执行不成功,则不执行命令2。 3逻辑或 命令1 | 命令2 其功能是,先执行命令1,如果执行不成功,则执行命令2;否则,若命令1执行成功,则不执行命令2。,4.5.6 成组命令,1 形式

14、以花括号括起来的全部命令可视为语法上的一条命令,出现在管道符的一边。 $ echo “User Report for date . ”; who ; | pr 使用花括号时在格式上应注意:左括号 “ ”后面应有一个空格;右括号“”之前应有一个分号( ;) 2( )形式 (echo “Current directory is pwd . “ cd /home/mengqc ; ls -l ; cp m1 em1 & rm m1 cat em1) | pr,二者存在重要区别:用花括号括起来的成组命令只是在本shell内执行命令表,不产生新的进程;而用圆括号括起来的成组命令是在新的子shell内执行

15、,要建立新的子进程。,4.6 shell变量,4.6.1 用户定义的变量 1变量名是以字母或下线符打头的字母、数字和下线符序列,并且大小写字母意义不同。 2. 定义变量并赋值的一般形式是: 变量名=字符串 3引用变量值 在变量名前面加上一个符号“$” 如果在赋给变量的值中要含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。 $ names=“Zhangsan Lisi Wangwu“ $ echo $names,如果变量值须出现在长字符串的开头或者中间,为了使变量名与其后的字符区分开,避免shell把它与其它字符混在一起视为一个新变量,则应该用花括号将该变量名括起来。例如, $

16、 dir=/usr/meng $ cat $dirqc/m1.c 4命令替换 有两种形式的命令替换:一种是使用倒引号引用命令,其一般形式是: 命令表 另一种形式是: $(命令表) 如:$ dir=$(pwd) $ echo $(pwd ; cd /home/mengqc ; ls -d),4.6.2 数组,bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。 对数组元素赋值的一般形式是: 数组名下标值 可以用declare命令显式声明一个数组,一般形式是: declare -a 数组名 读取数组元素值的一般格式是: $数组名下标 定义一个数组并为其赋初值的

17、一般形式是: 数组名=(值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表示变

18、量name的值,若变量未定义,则用空值替换。 表达式$name将被变量name的值替换。用花括号括起name,目的在于把变量名与后面的字符分隔开,避免出现混淆。替换后花括号被取消。 $namen表示数组变量name中第n个元素的值。 表达式$name*和$name都表示数组name中所有非空元素的值,每个元素的值用空格分开。如果用双引号把它们都括起来,那么二者的含义就有区别:对于“$name*“,它被扩展成一个词(即字符串),这个词由以空格分开的各个数组元素组成;对于“$name“,它被扩展成多个词,每个数组元素是一个词。如果数组name中没有元素,则$name被扩展为空串。,表达式$name

19、:-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的值

20、中去掉匹配部分后的结果就是该表达式的值;否则,该表达式的值就是name的值。在第一种格式中,去掉的部分是最少的匹配部分;而第二种格式中,去掉的部分是最多的匹配部分。,表达式$#和$#* 它们的值分别是由$和$*返回的参数的个数。 表达式$#namei 该表达式的值是数组name第i个元素值的长度(字符个数)。 表达式$#nane*和$#name 它们的值都是数组name中已经设置的元素的个数。,4.6.4 输入/输出命令,1read命令 可以利用read命令从键盘上读取数据,然后赋给指定的变量。read命令的一般格式是: read 变量1 变量2 变量个数与给定数据个数相同,则依次对应赋值 变

21、量个数少于数据个数,则从左至右对应赋值,但最后一个变量被赋予剩余的所有数据。 变量个数多于给定数据个数,则依次对应赋值,而没有数据与之对应的变量取空串 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 $pass

22、wd /tmp/ttt& sleep 2 echo “Login Incorrect.Re-enter, Please. “ stty cooked,4.6.5 位置参数,1位置参数及其引用 位置变量的名称很特别,分别是0,1,2, 命令行实参与脚本中位置变量的对应关系如下所示: exam1 m1 m2 m3 m4 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 引用它们的方式依次是$0, $1, $2, , $9, $10, $11等。 其中,$0始终表示命令名或shell脚本名。 位置变量不能通过一般赋值的方式直接赋值 通过命令行上对应位置的实参传值 2用set

23、命令为位置参数赋值,4.6.6 移动位置参数,每执行一次shift命令,就把命令行上的实参向左移一位,即相当于位置参数向右移动一个位置。 命令行: ex7 A B C D E F 原位置参数$0 $1 $2 $3 $4 $5 $6 移位后: $0 $1 $2 $3 $4 $5 shift命令不能将$0移走,所以经shift右移位置参数后, $0的值不会发生变化。 shift命令可以带有一个整数作为参数,4.6.7 预先定义的特殊变量,$# 命令行上参数的个数,但不包含shell脚本名本身。因此,$#可以给出实际参数的个数。 $? 上一条命令执行后的返回值(也称作 “返回码”、 “退出状态”、“

24、退出码”等)。它是一个十进制数。 $ 当前进程的进程号。 $! 上一个后台命令对应的进程号,这是一个由15位数字构成的数字串。 $ 由当前shell设置的执行标志名组成的字符串。 $* 表示在命令行中实际给出的所有实参字符串,它并不仅限于9个实参。 $ 它与$*基本功能相同,即表示在命令行中给出的所有实参。但“$”与“$*”不同。,4.6.8 环境变量,1常用的环境变量 HOME:用户主目录的全路径名 LOGNAME:即你的注册名,由Linux自动设置 MAIL: 你的系统信箱的路径 PATH: shell从中查找命令的目录列表。可以设置它, 如:PATH=$PATH:$HOME/bin PS

25、1:shell的主提示符。 bash默认的主提示符一般为“s-v$ ”。其中,s表示shell的名称;v表示bash的版本号 PS1=“Enter Command “ PWD:你当前工作目录的路径 SHELL:你当前使用的shell TERM: 你的终端类型,2使用环境变量 如果要使用环境变量或其它shell变量的值,必须在变量名之前加上一个“$”符号,不能直接使用变量名。 如:cd $HOME 3删除环境变量 $ unset NAME,4.6.9 环境文件,bash的环境文件包括.bash_profile文件、.bashrc文件、.bash_logout文件等。 在.bash_profile

26、中,设置了环境变量和文件掩码(umask) 名为.bashrc的脚本,每次启动bash时便会执行它。它只含有针对bash的命令,可以用来设置别名。.bashrc在.bash_profile之后执行 .bash_logout,它仅在退出注册的时候运行,4.6.10 export语句与环境设置,1export语句 一个进程在自己的环境中定义的变量是局部变量,仅限于自身范围,不能自动传给其子进程。就是说,子进程只能继承父进程的公用区和转出区中的数据,而每个进程的数据区和栈区是私有的,不能继承。为了使其后的各个子进程能继承父进程中定义的变量,就必须用export(转出)命令将这些变量送入进程转出区。

27、export命令的一般使用形式是:export 变量名 ,2环境变量的设置和显示 设置变量要用如下形式:变量名=值 如果变量值的字符串中带有空格等特殊字符,需要用引号把整个字符串括起来。 例如:$ PS1=“OK “ 利用export命令将这些变量输出,使它们成为公用量。如: export HOME HZ LOGNAME TERM 可以利用env命令列出所有的环境变量,包括本进程及以前的“祖先进程”所输出的变量,3set命令 set命令的功能主要有三个: 显示迄今为止所定义的全部变量,包括局部量和公用量; 用来设定位置参数的值; 改变执行shell脚本时的选项设定,可以使用户改变shell的功

28、能。 设置标志的一般形式是: set -标志 例如:set -x 关闭标志的一般形式是: set +标志 例如:set +x,4.7 参数置换变量,是另一种为变量赋值的方式,其一般形式是: 变量2=$ 变量1 op 字符串 其中,op表示操作符,它可以是下列四个操作符之一: : : = : + : ? 变量2的值取决于变量1(参数)是否为空串、利用哪个操作符以及字符串的取值。 在操作符的前后不留空格。 例如 echo -n “Please enter TERM1 ( default is ansi ) “ read terminal TERM1=$ terminal:-ansi echo “t

29、erminal type is $TERM1 now . “ echo “terminal=$terminal “,表4.2 四种参数置换变量的格式与功能,4.8 算 术 运 算,bash中执行整数算术运算的命令是let,其语法格式为: let arg 其中arg是单独的算术表达式。它使用C语言中表达式的语法、优先级和结合性。除+、-和逗号(,)之外,所有整型运算符都得到支持,此外,还提供了方幂运算符“*”。 在算术表达式中直接利用名称访问命名的参数,不要前面带有“$”符号 let 命令的替代表示形式是: (算术表达式),例如: let j=i*6+2 等价于: (j=i*6+2) 如果表达式

30、的值是非0,那么返回的状态值是0;否则,返回的状态值是1。 当表达式中有shell的特殊字符时,必须用双引号将其括起来。例如,let val=a|b 只有使用 $(算术表达式) 形式才能返回表达式的值,4.9 控制流结构,流控制是什么? #!/bin/bash #创建一个目录 mkdir /home/macro-chen/shell/txt #复制所有txt文件到/home/macro-chen/shell/txt/ cp *.txt /home/macro-chen/shell/txt/ rm f *.txt 上述脚本会出现问题吗?,如果目录创建失败或目录创建成功但文件拷贝失败, 如何处理?

31、,4.9.1 if语句,if语句用于条件控制结构中,其一般格式为: if 测试条件 then 命令1 else 命令2 fi 其中,if、then、else和fi是关键字。例如: if test -f “$1“ then echo “$1 is an ordinary file . “ else echo “$1 is not an ordinary file . “ fi,if语句中else部分可以缺省。例如, if test -f “$1“ then echo “$1 is an ordinary file . “ fi if 语句的else部分还可以是elseif结构,则用关键字“eli

32、f”代替“else if”。例如, if test - f “$1“ then pr $1 elif test - d “$1“ then ( cd $1 ; 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“ 也

33、完全可写成:_ -f “$1“_ 第三种形式是: 条件表达式 test命令可以和多种系统运算符一起使用。这些运算符可以分为四类:文件测试运算符、字符串测试运算符、数值测试运算符和逻辑运算符。,1有关文件方面的测试,2有关字符串方面的测试,3有关数值方面的测试,4逻辑运算符 上述测试条件可以在if 语句或循环语句中单个使用,也可以通过逻辑运算符把它们组合起来使用。可以在测试语句中使用的逻辑运算符有: ! 逻辑非( NOT ),它放在任意逻辑表达式之前,使原来为真的表达式变为假,使原来为假的变为真。例如, ! -r $1 , ! test -r “$1”等。 - a 逻辑与( AND ),它放在两

34、个逻辑表达式中间,仅当两个表达式都为真时,结果才为真。例如, - f “$myfile“ - a - r “$myfile“ - o 逻辑或( OR ),它放在两个逻辑表达式中间,其中只要有一个表达式为真,结果就为真。例如, “$a“ -ge 0 -o “$b“ -le 100 ,(表达式) 圆括号,它可以把一个逻辑表达式括起来,使之成为一个整体,优先得到运算。例如, ( “$a“ -ge 0 ) -a ( “$b“ -le 100 ) 逻辑表达式中的条件测试运算符优先级高于“!” 运算符,“!” 运算符的优先级高于“ -a”运算符,“-a”运算符高于 “-o”,而且圆括号( )高于 “-a”

35、 5特殊条件测试 (1) :表示不做任何事情,其退出值为0。 (2)true 表示总为真,其退出值总是0。 (3)false 表示总为假,其退出值是255。,4.9.3 case语句,case语句允许进行多重条件选择。其一般语法形式是: case 字符串 in 模式字符串1) 命令 命令; 模式字符串2) 命令 命令; 模式字符串n) 命令 命令; esac,在使用case语句时应注意: 每个模式字符串后面可有一条或多条命令,其最后一条命令必须以两个分号(即;)结束。 模式字符串中可以使用通配符 如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表示各模式是“或”的关系,即只

36、要给定字符串与其中一个模式相配,就会执行其后的命令表 各模式字符串应是唯一的,不应重复出现。并且要合理安排它们的出现顺序。 case语句以关键字case开头,以关键字esac(是case倒过来写!)结束。 case的退出(返回)值是整个结构中最后执行的那个命令的退出值。若没有执行任何命令,则退出值为零,4.9.4 while语句,shell中有三种用于循环的语句,它们是:while语句、for语句和until语句。 while语句的一般形式是: while 测试条件 do 命令表 done 测试条件部分除使用test命令或等价的方括号外,还可以是一组命令。根据其最后一个命令的退出值决定是否进入

37、循环体执行。,4.9.5 until语句,until语句的一般形式是: until 测试条件 do 命令表 done 它与while语句很相似,只是测试条件不同:当测试条件为假时,才进入循环体,直至测试条件为真时终止循环。,4.9.6 for语句,其使用方式主要有两种:一种是值表方式,另一种是算术表达式方式。 1值表方式 其一般格式是: for 变量 in 值表 ;do 命令表;done 根据循环变量的取值方式,其使用格式可分为三种: 格式一: for 变量 in 值表 do 命令表 done,格式二: for 变量 in 文件正则表达式 do 命令表 done 格式三: for i in $

38、* 或者 for i do do 命令表 命令表 done done,2算术表达式方式 其一般格式是: for ( e1;e2;e3) ; do 命令表;done 或者 for (e1;e2;e3) do 命令表 done 其中,e1, e2, e3是算术表达式。它的执行过程与C语言中for语句相似,即: 先按算术运算规则计算表达式e1; 接着计算e2,如果e2值不为0,则执行命令表中的命令,并且计算e3;然后重复,直至e2为0,退出循环。,4.9.7 break命令和continue命令,1break命令 break命令使程序从循环体中退出来。其语法格式是: break n 2continu

39、e命令 continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。其语法格式是: continue n ,4.9.8 exit命令,exit命令的功能是立即退出正在执行的shell脚本,并设定退出值。其语法格式是: exit n ,4.9.9 select语句,select 语句通常用于菜单的设计,它自动完成接收用户输入的整个过程,包括显示一组菜单项以及读入用户的选择。 select 语句的语法形式为: select identifierin word do 命令表 done 如果in word这一部分被省略,那么参数identifier就以位置参数($1, $2,

40、)作为给定的值。,4.10 函数,在shell脚本中可以定义并使用函数。其定义格式为: function函数名( ) 命令表 函数应先定义,后使用。调用函数时,直接利用函数名,如showfile,不必带圆括号 shell脚本与函数间的参数传递可利用位置参数和变量直接传递 通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是: return n ,4.11 作 业 控 制,执行命令set -o monitor,则交互式shell就实施作业管理。作业管理的命令有jobs,kill,bg,fg和wait。 4.11.1 jobs命令 不带参数时,可列

41、出当前尚未完成的作业。例如: $ jobs 2 +Done whowc -cd 1 -Stopped(SIGTTOU) man ls&,4.11.2 kill命令,使用kill命令可以向指定的进程发送TERM(终止)信号或者指定的信号。 其中一些信号可以使作业中止运行。 例如:kill -9 1893 信号可以由信号号码(sig)或者信号名(signame)指定。利用kill -l命令可以列出全部信号名。,4.11.3 bg和fg命令,bg命令可以把前台作业切换成后台作业 其语法格式是: bg job fg命令可以把后台作业切换成前台作业 其语法格式是: fg job 仅当作业控制被激活,这些

42、命令才起作用,4.12 shell内置命令,这些命令构造在shell内部,从而在shell进程内执行。已在前面介绍过的内置命令: :,. filename,break n , continue n , cd , echo, exit n , export, pwd, read, return n , set, shift n , test, bg, fg, kill等 。 1eval命令 格式是: eval arg 可以利用别的命令行作为自己的参数(arg),进行相应的变量或命令替换,并把替换结果结合成一个新的命令行,然后读取并加以执行。,#!/bin/bash getc() stty raw

43、 tmp=dd bs=1 count=1 2/dev/null eval $1= $tmp stty cooked press_any_key() echo -n “Strike any key to continue“ getc anychar echo -n “Enter a character:“ getc char echo echo “You entered $char “ press_any_key char echo,2exec命令 格式是: exec arg 在本shell中执行由参数arg指定的命令,并不创建新进程 3hash命令 格式是: hash -r name 可以确定

44、并记住由name指定的每个命令在搜索路径中的位置。 4readonly命令 格式是: readonly name 标记给定的name(变量名)是只读的,以后不能通过赋值语句改变其值,5trap命令 用来设定接收到某个信号所完成的动作,忽略某个信号的影响或者恢复该信号产生时系统预设的动作。 其格式是: trap arg n 为某些信号另外指定处理方式。例如: trap rm - f $temp ; exit 0 1 2 3 15 如果arg是空串,如 : trap “ 2 那么,信号2就被shell和它引用的命令忽略。 如果缺省arg,则把所有陷入信号n的动作恢复成原来系统设置的动作。如: tr

45、ap 1 2 如果trap命令后面没有任何参数,则显示与每个信号相关的命令表。,6type命令 格式是: type name 功能是,对于每一个name,如果作为命令名,它是如何被解释的,如内置命令、一般命令搜索路径等。 7unset命令 格式是:unset name 删除由name指定的相应变量或函数。 应注意,变量PATH,PS1,PS2,MAILCHECK和IFS不能被删除,即不能受unset的作用。,8umask命令 格式是umask -S mask 将用户文件创建掩码设置为mask的值。 9wait命令 格式是:wait n 等待由n(进程 ID)指定的进程终止,并报告终止状态。,4

46、.13 shell脚本调试,通常采用自底向上的方法,即:先搞清楚要脚本做什么,然后将过程的连续阶段分解为独立的步骤,最后利用shell提示符,交互式地检查和调试每个独立的步骤。 编写的脚本无法执行的原因除脚本文件缺少“执行”权限外,有两种可能:执行脚本的环境设置不对和脚本本身有错误。,4.13.1 解决环境设置问题, 不能直接在其他shell下运行bash脚本,解决的办法是在脚本的第一行写上:#!/bin/bash 在PATH环境变量中没有包括“.”(当前工作目录)。 解决办法是设置PATH:PATH=$PATH:. 脚本文件与已存在命令的名字相同。,4.13.2 解决脚本错误,基本的错误类型有两种:语法错误和逻辑错误。 语法错误是编写程序时违反了所用编程语言的规则而造成的。 逻辑错误通常是由于程序的逻辑关系存在问题。对此类问题需要进行程序调试。 一个很有用的技巧是使用set命令打开-x选项,或者在启动shell时使用-x选项将shell设置成跟踪模式。 另一个有用的技巧是在程序中经常使用echo或print命令,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1