第六章 shell 程序调试 一. 程序执行状态跟踪 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是 一. 程序执行状态跟踪 利用set命令的任选项特定功能来跟踪调试shell 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是 否在特定条件下执行到这里(断点设置). -v 在执行shell程序的同时, 把从shell程序中读入的 行显示出来. 用于跟踪shell程序的执行流程. -x 显示正在执行的语句及其变量的值. 用于动态 跟踪变量的值.
实例1. 程序运行语法为: prog_v [arg1 arg2 ….] $ cat prog_v set -v if [ $# -eq 2 ] then echo "correct argument number: $#" else echo "wrong argument number: $#" fi $ prog_v aa bb correct argument number: 2 显示读入的各语句 程序运行结果
如将程序第一行改为set -vx 将会什么结果? 实例2: 程序运行语法为: prog_x [arg1 arg2 ….] $ cat prog_x set -x if [ $# -eq 2 ] then echo "correct argument number: $#" else echo "wrong argument number: $#" fi $ prog_v aa bb cc ++ '[' 3 -eq 2 ']' ++ echo 'wrong argument number: 3' wrong argument number: 3 执行(而非读入)的语句及变量的值 程序的执行结果 如将程序第一行改为set -vx 将会什么结果?
在报警及时性和减轻系统负载之间合理设定间隔时间 二. 运行日志文件的建立和跟踪 利用运行日志文件记录和跟踪程序的中间状态和结果,例如: run_log=$HOME/log/prog1.log echo "[程序名] Entry Time:`date`" >> $run_log …… echo " [参数名:参数值]" >> $run_log command > data_file 2>> $run_log echo "Exit Time:`date`" >> $run_log 注意:状态信息是追加, 而不是覆盖日志文件. 可由另一程序(进程) 定时跟踪监测日志文件, 检测到某些关键字后报警, 例如: while true do status=`grep error $run_log` If [ -n "$status" ] Then 报警处理 fi sleep 300 done 或是warning等关键字 闪烁字符、反白显示、喇叭响铃等 在报警及时性和减轻系统负载之间合理设定间隔时间
三. 语句组的应用规则和限制 在shell程序中,常常使用包含多条语句的语句 组来完成某一特定的功能,由此来优化程序的结构。 三. 语句组的应用规则和限制 在shell程序中,常常使用包含多条语句的语句 组来完成某一特定的功能,由此来优化程序的结构。 语句组作为相对独立的程序模块,可被当作单条命 令或函数来应用。 需要特别注意的是,命令组的标准输出被重新 定向时,命令组中的所有命令的输出都将被重新定 向。 命令组的标准输入被重新定向时, 则根据命令 组中各命令的先后次序, 输入数据先满足第一个需 要输入数据的命令, 剩下的数据再满足第二个要输 入数据的命令, …依此类推.
语句组格式一: (command1; command2; … commandn) > outfile 例如: (echo "current dir is `pwd`" echo "files in the dir:" ls –l ) > outfile 文件outfile中的内容为: current dir is /home/teacher/zhanglan files in the dir: total 5 drwxr-xr–x 2 zl teacher 516 Jul 11 18:46 src -rw-r- -r- - 1 zl teacher 73 Sep 05 12:35 file1 -rwxr-xr-x 1 zl teacher 82 Sep 05 21:08 tst9 三条命令的输出都被重新定向到了文件outfile中.
语句组格式二: (command1; command2; … commandn) < datafile 或者: command | (command1; command2; …. commandn) 例如: ps -e | (read title; echo $title; grep student6) . read命令先读入ps命令输出结果的第一行 . grep命令从ps命令输出结果的第二行开始查找包含字符 串student6的行
语句格式三: while command1 command2 … commandn 语句组的运行结果作为条件表达式的值 do 循环体命令表 done 每次循环时, 都要执行一遍command1至commandn, 并根据 commandn的执行结果(退出状态)来作为整个while循环的 条件测试值, 判断是否进入下一轮循环. 语句组的运行结果作为条件表达式的值
例如: num=1 while pwd date ls –l | sort > filelist test $num -ne 6 do ……. num=`expr $num + 1` done 虽然每次循环时都要执行pwd、date和 ls 命令,但只有test 命令的执行结果才能决定是否进入下一轮循环.
datafile是整个while循环(语句组)的输入文件, 而不是语句done的输入文件. 语句格式四: while 条件表达式 do 循环体命令表 done < datafile 例如: i=1 while read id name component echo "$i UID: $id name: $name" i=`expr $i + 1` done < userlist 从userlist文件中每读入一行, 就执行一次循环体, 直到读到 userlist的文件尾. datafile是整个while循环(语句组)的输入文件, 而不是语句done的输入文件.
谢 谢 2019年4月7日