| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > SHELL

Bourne Shell及shell编程

时间:2006-06-28 22:35:53  来源:Linux联盟收集  作者:Linux联盟收集
" # ------------------------------------------- CreateAccess Development ted projectlead CreateAccess Development pat general CreateAccess Development jim general 11. 当显示正在生成的输出时,捕获每个脚本的输出6w6Linux联盟
如果脚本不能自动地将输出发送到文件的话,可以利用 Bash shell 的一些函数来捕获所执行脚本的输出,如:6w6Linux联盟
6w6Linux联盟
./test-bucket-1 -s 2>&1 | tee test-bucket-1.out6w6Linux联盟
6w6Linux联盟
让我们来分析上面的命令:6w6Linux联盟
6w6Linux联盟
"2>&1" 命令: 6w6Linux联盟
6w6Linux联盟
使用 "2>&1" 将标准错误重定向到标准输出。字符串 "2>&1" 表明任何错误都应送到标准输出,即 UNIX/Linux 下 2 的文件标识代表标准错误,而 1 的文件标识代表标准输出。如果不用此字符串,那么所捕捉到的仅仅是正确的信息,错误信息会被忽略。6w6Linux联盟
6w6Linux联盟
管道 "|" 和 "tee" 命令: 6w6Linux联盟
6w6Linux联盟
UNIX/Linux 进程和简单的管道概念很相似。既然这样,可以做一个管道将期望脚本的输出作为管道的输入。下一个要决定的是如何处理管道所输出的内容。在这种情况下,我们会将它捕获到输出文件中,在此示例中将之称为 "test-bucket-1.out"。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
但是,除了要捕获到输出结果外,我们还想监视脚本运行时产生的输出。为达到此目的,我们连接允许两件事同时进行的 "tee" (T- 形管道):将输出结果放在文件中同时将输出结果显示在屏幕上。 其管道类似于:6w6Linux联盟
6w6Linux联盟
代码:
process --> T ---> output file | V screen
6w6Linux联盟
如果只想捕获输出结果而不想在屏幕上看到输出结果,那可以忽略多余的管道: ./test-bucket-1 -s 2>&1 > test-bucket-1.out6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
假若这样,相类似的管道如下:6w6Linux联盟
6w6Linux联盟
process --> output file6w6Linux联盟
6w6Linux联盟
12. 在每个脚本内,捕获每个行命令所返回码6w6Linux联盟
决定功能测试成功还是失败的一种方法是计算已失败行命令的数量,即返回码不是 0。变量 "$?" 提供最近所调用命令的返回码;在下面的示例中,它提供了执行 "ls" 命令的返回码。6w6Linux联盟
代码:
# ------------------------------------------- # The commands are called in a subroutine # so that return code can be # checked for possible errors. # ------------------------------------------- ListFile() { echo "ls -al $1" ls -al $1 if [ $? -ne 0 ] then echo "ERROR found in: ls -al $1" let "errorCounter = errorCounter + 1" fi }
13. 记录失败事务的次数6w6Linux联盟
在功能测试中决定其成功或失败的一个方法是计算返回值不是 0 的行命令数量。但是,从我个人的经验而言,我习惯于在我的 Bash shell 脚本中仅使用字符串而不是整数。在我所参考的手册中没有清楚地说明如何使用整数,这就是我为什么想在此就关于如何使用整数和计算错误(行命令失败)数量的方面多展开讲的原因:6w6Linux联盟
首先,需要按如下方式对计数器变量进行初始化:6w6Linux联盟
6w6Linux联盟
let "errorCounter = 0"6w6Linux联盟
6w6Linux联盟
然后,发出行命令并使用 $? 变量捕获返回码。如果返回码不是 0,那么计数器增加 1(见蓝色粗体语句):6w6Linux联盟
代码:
ListFile() { echo "ls -al $1" ls -al $1 if [ $? -ne 0 ] then echo "ERROR found in: ls -al $1" let "errorCounter = errorCounter + 1" fi }
6w6Linux联盟
顺便说一下,与其它变量一样,可以使用 "echo" 显示整数变量。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
14. 在输出文件中,为了容易标识,突出显示错误消息6w6Linux联盟
当遇到错误(或失败的事务)时,除了错误计数器的数量会增加外,最好标识出此处有错。较理想的做法是,字符串有一个如 ERROR 或与之相似的子串(见蓝色粗体的语句),这个子串允许测试者很快地在输出文件中查找到错误。此输出文件可能很大,而且它对于迅速找到错误非常重要。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
代码:
ListFile() { echo "ls -al $1" ls -al $1 if [ $? -ne 0 ] then echo "ERROR found in: ls -al $1" let "errorCounter = errorCounter + 1" fi }
6w6Linux联盟
15. 如有可能,"实时"生成文件6w6Linux联盟
在某些情况下,有必要处理应用程序使用的文件。可以使用现有文件,也可以在脚本中添加语句来创建文件。如果要使用的文件很长,那最好将其作为独立的实体。如果文件很小而且内容简单或不相关(重要的一点是文本文件而不考虑它的内容),那就可以决定"实时"创建这些临时文件。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
下面几行代码显示如何"实时"创建临时文件:6w6Linux联盟
代码:
cd $HOME/fvt echo "Creating file softtar.c" echo "Subject: This is softtar.c" > softtar.c echo "This is line 2 of the file" >> softtar.c
第一个 echo 语句使用单个的 > 强行创建新文件。第二个 echo 语句使用两个 >> 将数据附加到现有文件的后面。顺便说一下,如果该文件不存在,那么会创建一个文件。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
16. 在执行脚本的过程中提供反馈6w6Linux联盟
最好在脚本中包含 echo 语句以表明它执行的逻辑进展状况。可以添加一些能迅速表明输出目的的语句。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
如果脚本要花费一些时间执行,那或许应在执行脚本的开始和结束的地方打印时间。这样可以计算出所花费的时间。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
在脚本样本中,一些提供进展说明的 echo 语句如下所示:6w6Linux联盟
代码:
# -------------------------------------------- echo "Subject: Product X, FVT testing" dateTest=`date` echo "Begin testing at: $dateTest" echo "" echo "Testcase: $CALLER" echo "" # -------------------------------------------- # -------------------------------------------- echo "" echo "Listing files..." # -------------------------------------------- # The following file should be listed: ListFile $HOME/.profile ... # -------------------------------------------- echo "" echo "Creating file 1" # --------------------------------------------
6w6Linux联盟
17. 提供脚本执行的摘要6w6Linux联盟
如果正在计算错误或失败事务的次数,那最好表明是否有错误。此方法使得测试者在看到输出文件的最后能迅速地辨认出是否存在错误。6w6Linux联盟
6w6Linux联盟
6w6Linux联盟
在下面的脚本示例中,代码语句提供了上述脚本的执行摘要:6w6Linux联盟
代码:
# -------------- # Exit # -------------- if [ $errorCounter -ne 0 ] then echo "" echo "*** $errorCounter ERRORS found during ***" echo "*** the execution of this test case. ***" terminate else echo "" echo "*** Yeah! No errors were found during ***" echo "*** the execution of this test case. Yeah! ***" fi echo "" echo "$CALLER complete." echo "" dateTest=`date` echo "End of testing at: $dateTest" echo "" exit 0 # end of file
18. 提供一个容易解释的输出文件6w6Linux联盟
在脚本生成的实际输出中提供一些关键信息是非常有用的。那样,测试者就可以很容易地确定正在查看的文件是否与自己所做的相关以及它是否是当前产生的。附加的时间戳记对于是否是当前状态是很重要的。摘要报告对于确定是否有错误也是很有帮助的;如果有错误,那么测试者就必须搜索指定的关键字,例如 ERROR,并确认出个别失败的事务。6w6Linux联盟
6w6Linux联盟
以下是一段输出文件样本的片段:6w6Linux联盟
代码:

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
    无相关信息
栏目更新
栏目热门