J'ai ci-dessous un scénario comme:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
J'ai ci-dessous un scénario comme:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Réponses:
Il existe plusieurs façons de faire cette boucle.
Avec la ksh93syntaxe (également prise en charge par zshet bash):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Pour tout shell de type POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Les deux boucles dorment 10 secondes à chaque itération avant de tester à nouveau l'existence du fichier.
Une fois la boucle terminée, vous devrez tester l'existence du fichier une dernière fois pour déterminer si la boucle s'est terminée en raison d'une exécution 10 fois ou en raison de l'apparition du fichier.
Si vous le souhaitez, et si vous avez accès aux outils inotify, vous pouvez remplacer l' sleep 10appel par
inotifywait -q -t 10 -e create ./ >/dev/null
Cela attendrait qu'un événement de création de fichier se produise dans le répertoire en cours, mais expirerait après 10 secondes. De cette façon, votre boucle se fermerait dès que le nom de fichier donné apparaît (s'il apparaît).
Le code complet, avec inotifywait(remplacer par sleep 10si vous ne le souhaitez pas), peut ressembler à
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
inotifywaitcomme un remplacement pour sleep.
Si le nombre n'est pas une variable, vous pouvez utiliser l'expansion d'accolade:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Si le nombre est une variable, vous pouvez utiliser la seqcommande:
count=10
for i in $(seq $count)
do
whatever
done
$(seq $count)
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
mais test -e file && exitest plus souple
exists1ou tel, il affiche toujours un tas d'erreurs si / quand un fichier correspondant n'est pas trouvé. (Il y a aussi des erreurs s'il y a plusieurs correspondances.) Tout autre shell que j'ai testé semble donner des erreurs dans tous les cas ...
done 2<>/dev/null. est- bashce que c'est scripté? je pensais que cela n'effectuait cela que dans un -icontexte interactif. encore, exists?est autant un nom de remplissage que file. mais oui, je déteste citer les redirections - si les vis sont tellement en place.
test -e.