2013-09-01 60 views
1

我试图在bash中创建一个脚本。如果文件不存在,或者如果它退出,那么该脚本应该退出并提示,一旦修改或删除,退出并提示提示。参数$ 1用于文件名,参数$ 2用于每次检查之间的时间间隔。使用-N来检​​查文件是否被修改是否足够? 到目前为止的代码(几个小错误,即时通讯工作):linux-bash脚本 - 测试文件

#!/bin/bash 
running=true; 
while[ $running ] 
do 
    if [ ! -f $1 ]; then 
    echo "File: $1 does not exist!" 
    running=false; 
    fi 

    if [ -f $1 ]; then 

     if [ ! -N $1 ]; then 
      sleep [ $2 ] 
      fi; 

     elif [ -N $1 ]; then 
      echo "File: $1 has been modified!" 
      running=false; 
      fi; 

    fi; 
done; 
+0

更好地使用'running = 1' /'running = 0'和while((running)); do''true'和'false'不要除非你把它们作为命令运行,否则它们有特殊的含义 –

+1

...你应该从'[]'切换到'[[]]'或者确保对所有的扩展名加双引号,也就是说,无论是[[[-f $ 1]]还是'[-f“$ 1”]',而不是*'[-f $ 1]'。 –

+1

... “睡眠”2美元,而不是“睡眠2美元”。方括号是“测试”命令的同义词,测试命令不是睡眠语法的一部分。 (它不是'if'语法的一部分,但这是一个单独的问题)。 –

回答

3

我假设你只针对安装有GNU stat的平台。

#!/bin/bash 

file="$1" 
sleep_time="$2" 

# store initial modification time 
[[ -f $file ]] || \ 
    { echo "ERROR: $1 does not exist" >&2; exit 1; } 
orig_mtime=$(stat --format=%Y "$file") 

while :; do 

    # collect current mtime; if we can't retrieve it, it's a safe assumption 
    # that the file is gone. 
    curr_mtime=$(stat --format=%Y "$file") || \ 
    { echo "File disappeared" >&2; exit 1; } 

    # if current mtime doesn't match the new one, we're done. 
    ((curr_mtime != orig_mtime)) && \ 
    { echo "File modified" >&2; exit 0; } 

    # otherwise, delay before another time around. 
    sleep "$sleep_time" 
done 

这就是说,在一个理想的世界,你就不会写这样的代码,你自己 - 而是,你会使用工具,如inotifywait,从而更高效地运行(由操作系统通知当事情发生变化时,而不需要定期检查。

+0

我可以看到,inotifywait工具确实使用起来更加理想,不幸的是,这是我学习的一部分,说实话,我有一个bash编程课程和一些其他的东西。这是我们学习一些东西的一项任务。你在这里给我看的这段代码正是我想要的,但是我读到了-N,它看起来有点像我可以使用的东西,但必须完全确定。非常感谢您的帮助! –

+0

顺便说一下,经过一些故障排除后,我仍然无法确定是什么导致了这种情况。但是,当我运行代码的一部分“((curr_mtime!= orig_mtime))&& \ {echo”File modified“>&2; exit 0;}”时,似乎有些问题。终端说:“语法错误附近的意外令牌'}'。非常感谢。 –

+0

@ Ole-MortenHeggertveit \只适用于在你之后立即添加换行符的情况,如果你将这两者都放在同一条线,把它留下。 –

1

不准确。 -Nfile's atime and mtime之间进行比较,在例如不准确的情况下。挂载relatime的ext3文件系统。您应该使用操作系统的文件监控工具或直接比较文件的运行时间。

0

顺便说一句 - 如果你改变running = false;要退出1,2,3,那么代码会更清晰,另一个调用此脚本的脚本可以使用返回值来确定脚本完成的原因。