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