第6章 Shell编程.ppt_第1页
第6章 Shell编程.ppt_第2页
第6章 Shell编程.ppt_第3页
第6章 Shell编程.ppt_第4页
第6章 Shell编程.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章Shell编程 Shell概述Shell编程习题 Shell概述 想想 当计算机播放音乐这个过程需要什么 声卡 没有声卡怎么播放东西操作系统 当然还要相关的声卡驱动程序 操作系统通过管理驱动程序管理设备 内存等与硬件相关的东西还要什么 就是你呐 没有用户发出命令操作系统怎么知道播放但是操作系统怎样识别用户发出的指令呢 也就是说 比如你输入一个指令 ls l 操作系统怎么知道你要列出文件信息呢 因此在操作系统与用户之间还要一个界面 他把用稍微人性化的语言或操作转换为操作系统能够识别的操作 在文本环境 这个沟通的工作 就是由shell完成 Shell关系图 什么是Shell Shell原意为外壳 用来形容物体外部的架构 Linux系统的Shell作为操作系统的外壳 为用户提供使用操作系统的接口 它是命令语言 命令解释程序及程序设计语言的统称 1 Shell可称为命令解释器 负责用户和操作系统之间的沟通 把用户下达的命令解释给系统去执行 并将系统传回的信息再次解释给用户 所以 它拥有自己内建的Shell命令集 也能被系统中其他应用程序调用 2 Shell还是一种高级程序设计语言 它有变量 关键字 有各种控制语句 如if case while for等语句 有自己的语法结构 利用Shell程序设计语言可以编写出功能强大的代码程序 Shell解析命令过程 学过DOS的都知道 DOS有内部命令与外部命令之分 在Shell中 有一些命令 比如改变工作目录命令cd 是包含在Shell内部的 还有一些命令 例如拷贝命令cp和移动命令rm 是存在于文件系统中某个目录下的单独的程序 如 bin目录中 对用户而言 不必关心一个命令是建立在Shell内部还是一个单独的程序 Shell接到用户输入的命令后首先检查命令是否是内部命令 若不是再检查是否是一个应用程序 然后 Shell在搜索路径里寻找这些应用程序 搜索路径就是一个能找到可执行程序的目录列表 如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件 将会显示一条错误信息 如果能够成功找到命令 该内部命令或应用程序将被系统传送给Linux内核 常用的Shell 1 Shell种类Linux中的Shell有多种类型 其中最常见的是BourneShell sh CShell csh 和KornShell ksh 三种Shell各有优缺点 BourneShell是Unix最初始的Shell 并且在每种Unix上都可以使用 BourneShell在Shell编程方面相当优秀 但在处理与用户的交互方面做得不如其他几种Shell Bash BourneAgainShell 是BourneShell的扩展 与BourneShell完全向下兼容 并且增加了许多特性 它还包含了很多CShell和KornShell中的优点 有灵活和强大的编程接口 同时又有很友好的用户界面 2 BashBash是大多数Linux系统的默认Shell Bash有以下的优点 1 补全命令 在Bash命令提示符下输入命令或程序名时 若没有输全命令或程序名 按 Tab 键 Bash将自动补全命令或程序名 2 通配符 在Bash下可以使用通配符 和 可以替代多个字符 而 则替代一个字符 3 历史命令 Bash能自动跟踪用户每次输入的命令 并把输入的命令保存在历史列表缓冲区中 4 别名 在Bash下 可用alias和unalias命令给命令或可执行程序起别名和删除别名 这样就可以用自己习惯的方式输入命令 aliaslm ls al 以后用lm命令就相当于ls al 5 输入 输出重定向 输入重定向用于改变命令的输入 输出重定向用于改变命令的输出系统默认的输入为键盘 输出为显示器 输入 输出重定向可以改变输入输出例 输入重定向mail s test rootdir out上面命令将ls命令的输出保存为文件dir out ls dir out上面命令将ls命令的输出追加到文件dir out 6 管道 管道用于将一系列的命令连接起来 也就是把前面命令的输出作为后面命令的输入 管道的命令是 管道的功能和用法与DOS Windows系统的完全相同 例 catdir out grep test wc l命令演示 lastlast greprootlast greproot wc l 7 提示符 Bash有两级提示符 第一级提示符就是登录Shell时见到的 默认为 可以通过重新给PS1变量赋值来改变第一级提示符 当Bash需要进一步提示以便补全命令时 它会显示第二级提示符 第二级提示符默认为 可以通过重新给PS2变量赋值来改变第二级提示符 一些特殊意义的字符也可以加入提示符赋值中 8 作业控制 作业控制是指在一个作业执行过程中 控制执行的状态 可以挂起一个正在执行的进程 并在以后恢复执行该进程 想想 一个命令只能完成一项任务 有时我们要求做系统处理的工作较多 而且什么时候执行也不定 怎么办 采用命令的组合 命令的组合就是简单的编程过程3 shell脚本的建立和执行 1 shell脚本的建立Shell程序可以存放在文件中 这种被shell解释执行的命令文件称为shell脚本 Shell脚本程序与DOS Windows系统的 bat批处理文件极为相似 但功能远远超过 bat批处理文件 它与WindowsNT系列网络操作系统中的脚本的功能和作用类似 shell脚本可以包含任意从键盘键入的Linux命令 建立shell脚本的步骤与建立普通文本文件的方式相同 利用编辑器 如vi 进行程序录入和编辑加工 2 执行shell脚本的方式执行shell脚本的方式基本上有下述三种 1 输入重定向 即用输入重定向方式让shell从给定文件中读入命令行 并进行相应处理 其一般形式 bash 脚本名例 bash ex12 以脚本名作为参数 其一般形式 bash脚本名例 bashex2 usr meng usr zhang过程与第一个类似 但可以带参数 增加灵活性 3 将shell脚本的权限设置为可执行 然后在提示符下直接执行它 通常 用户是不能直接执行由正文编辑器 如vi 建立的shell脚本的 因为直接编辑生成的脚本文件没有 执行 权限 如果要把shell脚本直接当作命令执行 就需要利用命令chmod将它置为有 执行 权限 例如 chmoda xex2就把shell脚本 ex2 设置为对所有用户都有 执行 权限 然后 在提示符后输入脚本名 ex2 就可直接执行该文件 例如 ex2 在windos环境 一个用户一般都有自己的个性化桌面 随系统启动时的程序 如qq 等等 这些设置用户工作环境在Linux一般通过一些变量来完成 Shell环境变量在用户登录过程中系统要做的一件事就是建立用户环境 就是Shell下的控制及设置 包括文件搜索路径 用户目录和系统提示符等 Linux Shell 环境由许多变量和这些变量的值组成 通过设置这些环境变量来控制用户环境 1 常用的环境变量1 HOME 用户主目录的全路径名 主目录是开始工作的位置 默认情况下 普通用户的主目录为 home 用户名 root用户的主目录为 root 例如 如果你的用户名为myname 则HOME的值为 home myname 不管你当前路径在哪里 都可以通过命令cd HOME返回到主目录 最简单的是cd 然后直接回车或cd 然后回车 在Linux系统中用 波浪线 表示用户的主目录 要使用环境变量或其他Shell变量 必须在变量名前加上一个 符号而不能直接使用变量名 2 LOGNAME 用户名 注册名 由Linux自动设置 系统通过与LOGNAME变量确认文件的所有者 有权执行某个命令等 3 PATH Shell从中查找命令的目录列表 它是一个非常重要的Shell变量 PATH变量包含有带冒号分界符的字符串 这些字符串指向含有你所使用命令的目录 PATH变量中的字符串顺序决定了先从哪个目录查找 PATH环境变量的功能和用法与DOS Windows系统的几乎完全相同 例如PATH PATH HOME bin 4 PS1 Shell的主提示符 既在Shell准备接受命令时显示的字符串 PS1定义你的主提示符是怎样构成的 一般设为PS1 u h W 意思是 用户名 主机名当前目录 5 PWD 你当前的工作目录的路径 它指出目前你在什么位置 6 SHELL 你当前使用的Shell和Shell放在什么位置 例如 查看用户登录系统时默认使用的Shell 最简单的方式是执行echo命令 查询系统环境变量的值 方法如下 echo SHELL bin bash 2 特殊变量在Shell中有一些变量是由系统设置好的 用户不能重新设置 1 表示命令行上参数的个数 2 表示上一条命令执行后的返回值 3 当前进程的进程号 4 表示Shell程序的所有参数串 5 表示命令行上输入的所有参数串 6 0命令行上输入的Shell程序名 演示 先将下面源代码用vi编辑器存为afile文件 bin bashecho thefileis 0 文件名echo thefirstargumentis 1 文件第一个参数echo Allargumentlist 存储所有命令行输入的参数echo Thetotalnumberofargumentis 程序中命令行参数的个数 end 为注释符号 为特殊的注释符号 它告诉操作系统使用其后面的程序来解释这个文件 设置执行chmoda xafile 执行 afileredhatlinux 输入三个参数 3 使用环境变量用echo命令查看任何一个环境变量的值 也可以在命令中将环境变量的值作为参数 使用环境变量时 要在其名称前面加上 符号 例如echo SHELL bin bashcd HOME bin 4 删除环境变量设置unsetNAME 如果NAME为一个环境变量 5 设置环境变量的文件使用BashShell时 有以下几个文件和用户的作业环境有关 1 etc profile2 etc bashrc3 etc inputrc4 HOME bash profile5 HOME bashrc6 HOME inputrc7 HOME bash login注 1 3为系统环境变量的设定 4 7为用户环境变量设定相关文件 课前回顾 1什么是Shell Shell原意为外壳 用来形容物体外部的架构 Linux系统的Shell作为操作系统的外壳 为用户提供使用操作系统的接口 它是命令语言 命令解释程序及程序设计语言的统称 Shell可称为命令解释器Shell还是一种高级程序设计语言2 Shell种类Linux中的Shell有多种类型 其中最常见的是BourneShell sh CShell csh 和KornShell ksh Bash BourneAgainShell 是BourneShell的扩展 与BourneShell完全向下兼容 并且增加了许多特性 它还包含了很多CShell和KornShell中的优点 有灵活和强大的编程接口 同时又有很友好的用户界面 课前回顾 3 Bash的功能与有点Bash有以下的优点 1 补全命令 按 Tab 键 Bash将自动补全命令或程序名 2 通配符 在Bash下可以使用通配符 和 可以替代多个字符 而 则替代一个字符 3 历史命令 Bash能自动跟踪用户每次输入的命令 并把输入的命令保存在历史列表缓冲区中 4 别名 在Bash下 可用alias和unalias命令给命令或可执行程序起别名和删除别名 这样就可以用自己习惯的方式输入命令 aliaslm ls al 以后用lm命令就相当于ls al6 管道 管道用于将一系列的命令连接起来 也就是把前面命令的输出作为后面命令的输入 管道的命令是 管道的功能和用法与DOS Windows系统的完全相同 例 catdir out grep test wc l7 提示符 8 作业控制 作业控制是指在一个作业执行过程中 控制执行的状态 可以挂起一个正在执行的进程 并在以后恢复执行该进程 4执行shell脚本的方式执行shell脚本的方式基本上有下述三种 1 输入重定向 即用输入重定向方式让shell从给定文件中读入命令行 并进行相应处理 其一般形式 bash 脚本名例 bash ex12 以脚本名作为参数 其一般形式 bash脚本名例 bashex2 usr meng usr zhang过程与第一个类似 但可以带参数 增加灵活性3 将shell脚本的权限设置为可执行 然后在提示符下直接执行它 通常 用户是不能直接执行由正文编辑器 如vi 建立的shell脚本的 因为直接编辑生成的脚本文件没有 执行 权限 如果要把shell脚本直接当作命令执行 就需要利用命令chmod将它置为有 执行 权限 例如 chmoda xex2就把shell脚本 ex2 设置为对所有用户都有 执行 权限 然后 在提示符后输入脚本名 ex2 就可直接执行该文件 例如 ex2 5Shell环境变量在用户登录过程中系统要做的一件事就是建立用户环境 就是Shell下的控制及设置 包括文件搜索路径 用户目录和系统提示符等 Linux Shell 环境由许多变量和这些变量的值组成 通过设置这些环境变量来控制用户环境 6 常用的环境变量1 HOME 主目录2 LOGNAME 用户名 注册名 3 PATH Shell从中查找命令的目录列表 它是一个非常重要的Shell变量 PATH变量包含有带冒号分界符的字符串 这些字符串指向含有你所使用命令的目录 PATH变量中的字符串顺序决定了先从哪个目录查找 PATH环境变量的功能和用法与DOS Windows系统的几乎完全相同 例如PATH PATH HOME bin4 PWD 你当前的工作目录的路径 它指出目前你在什么位置 5 SHELL 你当前使用的Shell和Shell放在什么位置 例如 查看用户登录系统时默认使用的Shell 最简单的方式是执行echo命令 查询系统环境变量的值 7Shell特殊变量在Shell中有一些变量是由系统设置好的 用户不能重新设置 1 表示命令行上参数的个数 2 表示上一条命令执行后的返回值 3 当前进程的进程号 4 表示Shell程序的所有参数串 5 表示命令行上输入的所有参数串 6 0命令行上输入的Shell程序名 演示 先将下面源代码用vi编辑器存为afile文件 bin bashecho thefileis 0 文件名echo thefirstargumentis 1 文件第一个参数echo Allargumentlist 存储所有命令行输入的参数echo Thetotalnumberofargumentis 程序中命令行参数的个数 end 为注释符号 为特殊的注释符号 它告诉操作系统使用其后面的程序来解释这个文件 设置执行chmoda xafile 执行 afileredhatlinux 输入三个参数 Shell编程 Shell变量Shell程序中也采用变量 用来存放字符串 Shell变量比C语言中的变量简单得多 没有众多存储类及类型的限制 也不需要预先定义 然后才能赋值 可以在使用时 现定义 现赋值 Shell有两类变量区别 环境变量和临时变量 环境变量是永久性变量 其值不会随shell脚本执行结束而消失 而临时变量是在shell程序内部定义的 其使用范围仅限于定义它的程序 离开了本程序就不能再用它 而且当程序执行完毕 它的值也就不存在了 1 变量名用户定义的变量是最普通的shell变量 变量名是以字母或下划线打头的字母 数字和下线线序列 并且大小写字母意义不同 例如 dir与Dir是本身不同的变量 这与C语言中标识符的定义相同 变量名的长度不受限制 2 变量赋值定义变量并赋值的一般形式 变量名 字符串例如 myfile usr meng ff m1 c中的 myfile 是变量名 是赋值号 字符串 usr meng ff m1 c是赋予变量myfile的值 注意 在赋值语句中 赋值号 的两边没有空格 否则在执行时会引起错误 变量的值可以改变 只需利用赋值语句重新给它赋值 例如 myfile usr liu ex1此时 变量myfile的值就是 usr liu ex1 3 引用变量值在程序中使用变量的值时 要在变量名前面加上一个符号 这个符号告诉shell 要取出其后变量的值 演示1用echo命令显示变量值dir usr meng ffecho dir usr meng ff 显示结果 echodirdir2显示不同变量的值today Sundayecho today TodaySunday 显示结果 4 命令替换可以将一个命令的执行结果赋值给变量 有两种形式的命令替换 1使用倒引号引用命令 其一般形式 命令表 例 将当前工作目录的全路径名存放到变量dir中 dir pwd 2使用形式是 命令表 其中 命令表是用分号隔开的命令 如上面的例子也可以改写为dir pwd 例 echo pwd cd home ls 算术运算 整数算术运算表达式与C语言中表达式的语法相同 1 语法格式let算术表达式例 leta a 1其替代表示形式是let a a 1 或 a a 1 注 Shell是一种弱编程语言 算术运算不算强大 一般用 a a 1 格式 执行效率较高 2 算术运算符及其优先级表6 2中列出了部分算术运算符的优先级和结合性 优先级是由高到低的 1级最高 同级运算符在同一个表达式中出现时 其执行顺序由结合性表示 表示从左至右 表示从右至左 如果表达式中有特殊字符 必须用双引号将其括起来 如 let v a b 而letv a b是无法正确执行的 条件测试 用test命令进行条件测试 格式为testexpression或 expression 演示 测试字符串 test8 9 测试字符串8是否等于9echo 表示上一条命令执行后的返回值1 其值为假 返回1 8 8 省略 test 改用中括号形式 注意中括号中的空格echo 0 test命令可以和多种系统运算符一起使用 这些运算符可以分为4类 整数运算符 字符串运算符 文件运算符和逻辑运算符 1 数值运算符 用来判断数值表达式的真假 int1 eqint2如果int1 int2 则为真 int1 geint2如果int1 int2 则为真 int1 gtint2如果int1 int2 则为真 int1 leint2如果int1 int2 则为真 int1 ltint2如果int1 int2 则为真 int1 neint2如果int1 int2 则为真 2 字符串运算符 用来判断字符串表达式的真假 str1 str2如果str1和str2相同 则为真 str1 str2如果str1和str2不相同 则为真 str如果str不为空 则为真 nstr如果str的长度大于零 则为真 zstr如果str的长度等于零 则为真 3 文件运算符 用来判断文件是否存在 类型及属性 dfilename如果filename为目录 则为真 ffilename如果filename为普通的文件 则为真 rfilename如果filename为只读 则为真 sfilename如果filename的长度大于零 则为真 wfilename如果filename为可写 则为真 xfilename如果filename为可执行 则为真 演示 d etc 判断 etc是否为目录echo 显示其返回值0 其值为真 返回0 w etc 判断用户对目录 etc是否有写的权限echo 显示其返回值 4 逻辑运算符 用来结合表达式或取得表达式相反值 expr如果expr为假 则返回真 expr1 aexpr2如果expr1和expr2同时为真 则返回真 expr1 oexpr2如果expr1或expr2有一个为真 则返回真 演示 f etc passwd a w etc passwd 判断文件存在且具有可写的权限echo 显示其返回值0 其值为真 返回0 问题 在生活中经常遇到选择 如 成绩大于60算及格等 计算机怎样处理选择问题呢 条件语句Shell具有一般高级语言所具有的控制结构 如if语句 case语句 1 if语句if语句可根据表达式的值是真或假来决定要执行的程序段落 ifexpressionl 若expressionl为真thencommands 则执行这些命令elifexpression2 否则若expression2为真thencommands 则执行这些命令else 若以上的表达式都不成立commands 则执行这些命令fi 结束if语句fi 结束if语句 例1 将显示目录内是否有 etc shadow文件 bin bashif f etc shadow 判断文件是否存在thenecho Thereisaexample iffileincurrentdirectory elseecho noexample iffileincurrentdirectory fi end 例2 在键盘上读取一个字符 然后根据字符的值来判断对错 bin bashecho n Pleaseinputtheanswer n不换行readI 从键盘读入数据if I y thenecho Theanswerisright elif I n thenecho Theansweriswrong elseecho BadInput fi end 例3 从键盘一次读入多个变量 用语句readvar1var2 变量之间用空格隔开 readnamegender 读入两个变量echo nameecho gender假如在键盘输入linuxman 则上边的语句执行的结果为linux 变量name的值man 变量gender的值如果输入文本过长 Shell将所有的超长的部分赋给最后一个变量 课前回顾 1命令替换可以将一个命令的执行结果赋值给变量 有两种形式的命令替换 1使用倒引号引用命令 其一般形式 命令表 例 将当前工作目录的全路径名存放到变量dir中 dir pwd 2使用形式是 命令表 其中 命令表是用分号隔开的命令 如上面的例子也可以改写为dir pwd 例 echo pwd cd home ls 课前回顾 2算术运算let算术表达式例 leta a 1其替代表示形式是let a a 1 或 a a 1 注 Shell是一种弱编程语言 算术运算不算强大 一般用 a a 1 格式 执行效率较高 课前回顾 3条件测试用test命令进行条件测试 格式为testexpression或 expression 演示 测试字符串 test8 9 测试字符串8是否等于9echo 表示上一条命令执行后的返回值1 其值为假 返回1 8 8 省略 test 改用中括号形式 注意中括号中的空格echo 0 课前回顾 test命令可以和多种系统运算符一起使用 这些运算符可以分为4类 整数运算符 字符串运算符 文件运算符和逻辑运算符 常用的条件 1 数值运算符 用来判断数值表达式的真假 int1 eqint2如果int1 int2 则为真 int1 geint2如果int1 int2 则为真 int1 gtint2如果int1 int2 则为真 int1 leint2如果int1 int2 则为真 2 字符串运算符 用来判断字符串表达式的真假 str1 str2如果str1和str2相同 则为真 str1 str2如果str1和str2不相同 则为真 str如果str不为空 则为真 3 文件运算符 用来判断文件是否存在 类型及属性 ffilename如果filename为普通的文件 则为真 rfilename如果filename为只读 则为真 sfilename如果filename的长度大于零 则为真 条件语句Shell具有一般高级语言所具有的控制结构 如if语句 case语句 例1 将显示目录内是否有 etc shadow文件 bin bashif f etc shadow 判断文件是否存在thenecho Thereisaexample iffileincurrentdirectory elseecho noexample iffileincurrentdirectory fi end 课前回顾 2 case语句case语句用来从很多的测试条件中选择符合的条件执行 casestringin 测试string字符串str1 若str1符合commands 则执行这些命令str2 commands 若str1和str2都不符合commands 则执行这些命令esac 结束case语句 例 检查命令行的第一个参数是 i 或 e 如果是 i 则计算由第二个参数指定的文件中以i开头的行数 如果是 e 则计算由第二个参数指定的文件中以e开头的行数 如果第一个参数既不是 i 也不是 e 则在屏幕上显示一条错误的信息 其中 符号为匹配行首的符号 假如aaaa文件为包含8行以i开头和18行以e开头的文本文件 则检索该文件程序如下 bin bashcase 1in 1是命令行第一个参数 i count grep i 2 wc l 查找并计算以i开头的行数 是反引号echo Thenumberoflinesin 2thatstartwithaniis count e count grep e 2 wc l echo Thenumberoflinesin 2thatstartwithaneis count 默认匹配echo Thatoptionisnotrecognized esac 和case成对出现 end将其存为 a1 将其属性修改为可执行chmoda xa1 执行程序 a1 a1 iaaaaThenumberoflinesinfile1thatstartwithaniis8 a1 eaaaaThenumberoflinesinfile1thatstartwithaniis18 循环命令Shell中提供了几种执行循环的命令 比较常见的命令有for while until shift命令 1 for语句for语句有两种格式 第一种格式 forvarinlistdocommandsdone 第二种格式 forvardostatementsdone使用这种形式时 对变量var中的每一项 for语句都执行一次 此时Shell程序假定var包含Shell程序在命令行的所有位置参数 所以此种方式也可以写成 forvarin dostatementsdone 例1 使用通配符显示当前目录下所有文本文件 txt 的名称和内容 bin bashforfilein txt 对目录下的每个txt文件doecho file 显示文件名cat file 显示文件内容done end 例2 把表中的几个值显示出来 bin bashforpin12345doecho pdone end 演示 例3 求命令行所有整数之和 bin bashsum 0forpin doletsum sum pdoneecho sum sum end 2 while及until语句while语句与until语句的语法结构和用途相似 while语句会在测试条件为真时循环执行 语法如下 whileexpressiondocommandsdone而until语句会在其测试条件为假时循环执行 语法为untilexpressiondocommandsdone 例 编程计算1 2 3 4 5的值 bin bashlets 0 p 1whiletest p le5dolets s pletp p 1done

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论