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
bash
shell-script
Rocky86
la source
la source
Réponses:
Il existe plusieurs façons de faire cette boucle.
Avec la
ksh93
syntaxe (également prise en charge parzsh
etbash
):Pour tout shell de type POSIX:
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 parCela 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 parsleep 10
si vous ne le souhaitez pas), peut ressembler àla source
inotifywait
comme un remplacement poursleep
.Si le nombre n'est pas une variable, vous pouvez utiliser l'expansion d'accolade:
Si le nombre est une variable, vous pouvez utiliser la
seq
commande:la source
$(seq $count)
mais
test -e file && exit
est plus souplela source
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 quefile
. mais oui, je déteste citer les redirections - si les vis sont tellement en place.test -e
.