while循环来testing一个文件是否存在于bash中

我正在研究一个shell脚本,它只对txt文件进行某些更改,但是这个testing循环不起作用,我想知道为什么? 谢谢!

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

当你说“不行”时,你怎么知道这行不通?

您可以尝试通过添加以下内容来确定文件是否实际存在:

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

你也可以通过input'echo $ SHELL'来确保你正在使用Bash(或相关的)shell。 我认为CSH和TCSH在这个循环中使用略微不同的语义。

如果你安装了inotify-tools,你可以这样做:

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

这减less了睡眠引入的延迟,同时每隔2秒检查一次。 如果您预计需要,可以添加更多事件。

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

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

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

我遇到了一个类似的问题,它引导我在这里,所以我只是想离开我的解决scheme给任何经验相同的人。

我发现,如果我运行cat /tmp/list.txt ,文件将是空的,即使我确定内容被立即放在文件中。 结果是我sleep 1;sleep 1; 就在cat /tmp/list.txt之前,它按预期工作。 从创build文件到写入文件的时间之间肯定有一段延迟,或者是沿着这些线的某些延迟。

我的最终代码:

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

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

像这样做

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