我有以下场景:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
答案1
如果计数不是变量,您可以使用大括号扩展:
for i in {1..10} # you can also use {0..9}
do
whatever
done
如果计数是变量,您可以使用以下seq
命令:
count=10
for i in $(seq $count)
do
whatever
done
答案2
有很多方法可以完成这个循环。
Withksh93
语法(也受zsh
and支持bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
对于任何类似 POSIX 的 shell:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
在再次测试文件是否存在之前,两个循环在每次迭代中都会休眠 10 秒。
循环结束后,您必须最后一次测试文件是否存在,以确定循环是否由于运行 10 次而退出,或者由于文件出现而退出。
如果您愿意,并且可以访问 inotify-tools,您可以将sleep 10
调用替换为
inotifywait -q -t 10 -e create ./ >/dev/null
这将等待当前目录中发生文件创建事件,但会在 10 秒后超时。这样,一旦给定的文件名出现(如果出现),循环就会退出。
完整的代码(如果您不想要则inotifywait
替换为)可能看起来像sleep 10
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
inotifywait -q -t 10 -e create ./ >/dev/null
done
if [ -e filename ]; then
echo 'file appeared!'
else
echo 'file did not turn up in time'
fi
答案3
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
虽然test -e file && exit
更灵活