
第20讲 控制脚本流程
第20讲 控制脚本流程

引言 如何测试表达式的逻辑值? ”如何设计分支结构? 必如何设计循环结构? 第20讲控制脚本流程第2页共35页
第20讲 控制脚本流程 第2页 共35页 引 言 ❖如何测试表达式的逻辑值? ❖如何设计分支结构? ❖如何设计循环结构?

【问题的提出】 Geecy软件开发公司的开发人员Tom所开发的通讯录 管理脚本phone.sh的改进版本如下: tom@geecy:cat phone.sh #!/bin/bash read Countcount file.txt echo "[{Count}]: echo "Enter your name:" -n read Name echo -n "Enter your phone number: read Phone echo "$Count:$Name:$Phone"> file.txt Count=$((Count +1 ) echo $Count count file.txt ./phone.sh 第20讲控制脚本流程第3页共35页
第20讲 控制脚本流程 第3页 共35页 【问题的提出】 ❖ Geecy软件开发公司的开发人员Tom所开发的通讯录 管理脚本phone.sh的改进版本如下: tom@geecy:~$ cat phone.sh↙ #!/bin/bash read Count > file.txt Count=$(( Count + 1 )) echo $Count > count_file.txt ./phone.sh

【问题的提出】(续) 。该版本比旧版本已经有了很大的改进,能够满足 般的使用。但是根据Tom的开发经验,该版本至少存 在四大缺陷: (1)脚本运行的稳定性不高,因为该脚本严重依赖于辅助文件 count_file..txt,一旦该文件被以外破坏,该脚本将不能正常工作; (2)运行性能不高,因为该脚本在运行过程中需要频繁读写三个文件, 而从该脚本的功能来看,运行过程中需要频繁读写的文件应该只有数据 文件“file.txt”; (3)功能单一,因为目前只有增加功能,还缺乏基本的搜索功能; (4)用户界面不够友好,应该使用菜单式的用户界面。 因此Tom需要继续改进该脚本。 第20讲控制脚本流程第4页共35页
第20讲 控制脚本流程 第4页 共35页 【问题的提出】(续) ❖ 该版本比旧版本已经有了很大的改进,能够满足一 般的使用。但是根据Tom的开发经验,该版本至少存 在四大缺陷: (1 )脚本运行的稳定性不高,因为该脚本严重依赖于辅助文件 count_file.txt,一旦该文件被以外破坏,该脚本将不能正常工作; (2)运行性能不高,因为该脚本在运行过程中需要频繁读写三个文件, 而从该脚本的功能来看,运行过程中需要频繁读写的文件应该只有数据 文件“file.txt” ; (3)功能单一,因为目前只有增加功能,还缺乏基本的搜索功能; (4)用户界面不够友好,应该使用菜单式的用户界面。 因此Tom需要继续改进该脚本

【问题分析】 如果要提高稳定性,就要想办法避免使用辅助文件 count file.txt。 最大值就在数据文件file.txt的最后一行的第一个 数据域。只需要想办法在增加一行新数据之前把该 值读出来,然后增加一,就可以构造出下一个编号 。命令tal,能够从一个文本文件的最后一行起,连 续抽取若干行数据显示到屏幕。 第20讲控制脚本流程第5页共35页
第20讲 控制脚本流程 第5页 共35页 【问题分析】 ❖ 如果要提高稳定性,就要想办法避免使用辅助文件 count_file.txt。 ❖ 最大值就在数据文件file.txt的最后一行的第一个 数据域。只需要想办法在增加一行新数据之前把该 值读出来,然后增加一,就可以构造出下一个编号。 ❖ 命令tail,能够从一个文本文件的最后一行起,连 续抽取若干行数据显示到屏幕

【问题分析】(续) 如果上述的稳定性问题解决了,那么只需要 避免使用脚本的递归调用就可以实现整个运 行过程只需要频繁读写一个文件,即数据文 件file.txt。 只要找到能够重复运行某一部分脚本的替代 方法,那么脚本的递归调用这种方法就可以 “退役”了。 第20讲控制脚本流程第6页共35页
第20讲 控制脚本流程 第6页 共35页 【问题分析】(续) ❖ 如果上述的稳定性问题解决了,那么只需要 避免使用脚本的递归调用就可以实现整个运 行过程只需要频繁读写一个文件,即数据文 件file.txt。 ❖ 只要找到能够重复运行某一部分脚本的替代 方法,那么脚本的递归调用这种方法就可以 “退役”了

【问题分析】(续) 对于搜索功能的实现,可以使用grep命 令来完成。 第20讲控制脚本流程第7页共35页
第20讲 控制脚本流程 第7页 共35页 【问题分析】(续) ❖对于搜索功能的实现,可以使用grep命 令来完成

【问题分析】(续) 菜单式的用户界面的实现原理,就是首 先打印若干个菜单项的内容到屏幕上, 等待用户选择其中一个功能,脚本程序 根据用户的键盘输入来判断用户的选择 从而进行相应功能的操作。然后重复。 第20讲控制脚本流程第8页共35页
第20讲 控制脚本流程 第8页 共35页 【问题分析】(续) ❖菜单式的用户界面的实现原理,就是首 先打印若干个菜单项的内容到屏幕上, 等待用户选择其中一个功能,脚本程序 根据用户的键盘输入来判断用户的选择, 从而进行相应功能的操作。然后重复

测试表达式 test命令能够对表达式进行测试并求出 True或False的逻辑值。例如: test $Name ="Linus test命令的语法要求被测试的表达式中 的比较运算符(例如这里的“=”)的左 右两边必须有空格。 第20讲控制脚本流程第9页共35页
第20讲 控制脚本流程 第9页 共35页 测试表达式 ❖ test命令能够对表达式进行测试并求出 True或False的逻辑值。例如: test $Name = "Linus" ❖ test命令的语法要求被测试的表达式中 的比较运算符(例如这里的“=”)的左 右两边必须有空格

测试表达式(续) test命令可以一次测试多个表达式。这些表 达式之间需要使用选项“-a”或“-o”连接。 例如: test $Name "Linus"-a $Country "China 为了有更好的可读性,用户可以使用方括号 “[]”来代替test命令。例如: $Name "Linus" 第20讲控制脚本流程第10页共35页
第20讲 控制脚本流程 第10页 共35页 测试表达式(续) ❖ test命令可以一次测试多个表达式。这些表 达式之间需要使用选项“-a”或“-o”连接。 例如: test $Name = "Linus" -a $Country = "China" ❖ 为了有更好的可读性,用户可以使用方括号 “[ ]”来代替test命令。例如: [ $Name = "Linus" ]