while循环测试bash中是否存在文件

时间:2010-03-04 14:09:07

标签: bash shell

我正在开发一个shell脚本,只有在txt文件存在的情况下对txt文件进行某些更改,但是这个测试循环不起作用,我想知道为什么? 谢谢!

while [ ! -f /tmp/list.txt ] ;
do
      sleep 2
done

8 个答案:

答案 0 :(得分:110)

当你说“不起作用”时,你怎么知道它不起作用?

您可以尝试通过添加:

来确定文件是否确实存在
while [ ! -f /tmp/list.txt ]
do
  sleep 2
done
ls -l /tmp/list.txt

您也可以通过输入'echo $ SHELL'来确保使用Bash(或相关)shell。我认为CSH和TCSH对这个循环使用了略微不同的语义。

答案 1 :(得分:50)

如果您安装了inotify-tools,则可以执行以下操作:

file=/tmp/list.txt
while [ ! -f "$file" ]
do
    inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done

这样可以减少睡眠引起的延迟,同时仍然每2秒检查一次。如果您预计需要它们,可以添加更多事件。

答案 2 :(得分:4)

我有同样的问题,放了!括号外;

while ! [ -f /tmp/list.txt ];
do
    echo "#"
    sleep 1
done

另外,如果你在循环中添加一个echo,它会告诉你是否进入循环。

答案 3 :(得分:2)

我遇到了一个类似的问题,它引导我到这里,所以我只想为经历过同样问题的人留下我的解决方案。

我发现,如果我运行cat /tmp/list.txt,文件将为空,即使我确定文件中有内容被立即放置。如果我在sleep 1;正好按预期工作之前放置了cat /tmp/list.txt。在创建文件的时间和写入文件的时间之间必须存在延迟,或者沿着这些行进行。

我的最终代码:

while [ ! -f /tmp/list.txt ];
do
    sleep 1;
done;
sleep 1;
cat /tmp/list.txt;

希望这有助于拯救某个令人沮丧的半小时!

答案 4 :(得分:1)

就像@ zane-hooper一样,我在NFS上遇到过类似的问题。在并行/分布式文件系统上,在一台机器上创建文件和另一台“看到”它的机器之间的延迟可能非常大,所以在while循环退出之前,我可以在创建文件后等待一整分钟(和它还有“看到”已经删除的文件的后果。

这个创造了一个错误,即脚本“不起作用”,而实际上是文件系统正在丢球。

我花了一段时间才弄明白,希望能节省一些时间。

PS这也会导致恼人的“过时文件处理程序”错误。

答案 5 :(得分:0)

与bash和sh一起使用:

touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
   echo "testfile still exist..."
   sleep 1
done
echo "now testfile is deleted.."

答案 6 :(得分:0)

这是一个具有超时的版本,因此一段时间后循环会因错误而结束:

# After 60 seconds the loop will exit
timeout=60

while [ ! -f /tmp/list.txt ];
do
  # When the timeout is equal to zero, show an error and leave the loop.
  if [ "$timeout" == 0 ]; then
    echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
    exit 1
  fi

  sleep 1

  # Decrease the timeout of one
  ((timeout--))
done

答案 7 :(得分:-3)

这样做

while true
do
  [ -f /tmp/list.txt ] && break
  sleep 2
done
ls -l /tmp/list.txt