实验四:文件状态测试--动态检测指定文件的状态信息,当文件的大小发生改变时,给出提示信息,并继续前进检测。当文件的大小的变化次数或持续检查无变化次数达到一定值时,退出检查--操作系统原理和实践

实验目的

熟悉UNIX的基本SHELL程序设计方法,包括:

命令行参数检测

变量设置

文件状态检测与特定信息读取

程序运行控制

实验内容

编写一个SHELL程序动态检测指定文件的状态信息,当文件的大小发生改变时,给出提示信息,并继续前进检测。

当文件的大小的变化次数或持续检查无变化次数达到一定值时,退出检查,程序结束。

实验内容:shell程序设计思路

(1)清屏;

(2)提示用户输入要检测其状态的文件名

(3)显示该文件的状态信息(提示:该状态信息可由命令ls –l 来得到),或找不到该文件时的错误提示;

(4)用cut命令,或用sed或awk命令来截取状态信息中文件的大小并保存;

(5)每隔5秒钟检测一次该文件大小的信息,并与保存的文件原来的大小相比较;

(6)如果文件大小未改变,则屏幕显示不变,并继续每隔5秒钟检测一次;

(7)如果文件大小已改变,则保存新的文件大小,并在屏幕上显示:file [ filename ] size changed(括号中的filename为本程序运行时用户输入的被检测的文件名)。程序继续每隔5秒钟检测一次文件的大小;

(8)程序循环执行5~7步的操作。当被检测的文件或者已累计改变了两次大小,或者已连续被检测了十次还未改变大小时,给出相应提示,然后清屏退出。

实验内容:shell程序设计思路

(1)清屏;

    clear

(2)提示用户输入要检测其状态的文件名;

    echo “Input name:”
    read fname

(3)显示该文件的状态信息(提示:该状态信息可由命令ls –l 来得到),或找不到该文件时的错误提示;

      用  if  test –f $fname         # 这里也可以用:if [ -f $name],测试文件是否存在
            then
            fi         
    ls –l [ $fname]

linux中ls -l命令以长格式显示目录下的内容列表。

输出的信息从左到右依次包括文件名、文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等

(4)用cut命令,或用sed或awk命令来截取状态信息中文件的大小并保存;

      ls –l [ $fname]   |   cut –c 36-46    #管道:文件大小是在36列到46列
      oldstat=`          `          #注意是单撇号

(5)每隔5秒钟检测一次该文件大小的信息,并与保存的文件原来的大小相比较;

     while [ xxx  -ne. 2 ]
    do
           ……
    done
if [ “$oldstat”=“$newstat” ]

then
     …….
fi

(6)如果文件大小未改变,则屏幕显示不变,并继续每隔5秒钟检测一次;

(7)如果文件大小已改变,则保存新的文件大小,并在屏幕上显示:file [ filename ] size changed(括号中的filename为本程序运行时用户输入的被检测的文件名)。程序继续每隔5秒钟检测一次文件的大小;

(8)程序循环执行5~7步的操作。当被检测的文件或者已累计改变了两次大小,或者已连续被检测了十次还未改变大小时,给出相应提示,然后清屏退出。
 

计数: test_count=`expr $test_count + 1`
                   change_count=`expr $change_count + 1`.
                   #注意,数学运算命令expr,两边用单撇号

参考代码

#
#detect file status
#
tput clear  # clear screen
echo "Please input file name:"
read filename
filesize=`ls -l $filename | awk '{ print $5 }'`
echo $filesize
cursize=`ls -l $filename | awk '{ print $5}'`
echo $cursize
change=0
unchange=0
while [ "$change" -le 1 -a "$unchange" -le 9 ]
do
   if [ "$filesize" == "$cursize" ]
   then
   unchange=`expr $unchange + 1`
   echo "unchange=$unchange"
   else
   filesize=$cursize
   change=`expr $change + 1`
   echo "file $filename size changed"
   fi
   sleep 5
   sync
   cursize=`ls -l $filename | awk '{ print $5 }'`
done;
 echo "finish"
exit 0

程序要求达到的运行效果

./test05.sh运行程序

1、程序运行时,如果找不到指定的文件,程序提示错误信息:

创建test.txt文件,输入123456

2、运行程序,输入要检查的文件名file1,在十次检查周期内,文件大小都一直不变的情况下,程序输出如下信息:

3、一旦当发现检查的文件大小改变时,程序显示如下信息:

监测过程中文件大小改变1次

后台修改文件内容

监测过程中文件大小改变2次

猜你喜欢

转载自blog.csdn.net/aiqq136/article/details/124778276