我正在开发一个shell脚本,只有在txt文件存在的情况下对txt文件进行某些更改,但是这个测试循环不起作用,我想知道为什么? 谢谢!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
答案 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