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 ksh93
syntaxe (également prise en charge par zsh
et 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 10
appel 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 10
si 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
inotifywait
comme 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 seq
commande:
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 && exit
est plus souple
exists1
ou 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- bash
ce que c'est scripté? je pensais que cela n'effectuait cela que dans un -i
contexte 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
.