Je souhaite vérifier l'existence de plusieurs répertoires, par exemple dir1
, dir2
et dir3
dans le répertoire de travail.
J'ai le suivant
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Mais je soupçonne qu'il existe une façon plus élégante de procéder. Ne présumez pas qu'il existe un modèle dans les noms des répertoires.
Le but est de vérifier l'existence de quelques répertoires et la non-existence d'autres.
J'utilise Bash, mais le code portable est préférable.
shell-script
shell
files
directory
control-flow
Élégance
la source
la source
$PWD
.[ -d "$PWD/dir1"]
est équivalent à[ -d "dir1" ]
.Réponses:
Si vous vous attendez déjà à ce qu'ils soient des répertoires et que vous vérifiez simplement s'ils existent tous, vous pouvez utiliser le code de sortie de l'
ls
utilitaire pour déterminer si une ou plusieurs "erreurs se sont produites" :Je redirige la sortie et stderr vers
/dev/null
afin de le faire disparaître, car nous nous soucions uniquement du code de sortie dels
, pas de sa sortie. Tout ce qui est écrit/dev/null
disparaît - il n'est pas écrit sur votre terminal.la source
1
c'est stdout,2
est stderr et je sais ce qu'est la redirection. Je ne comprends pas la signification de/dev/null
, et je ne sais pas comment analyser la commande.&>filename
redirige à la fois stdout et stderr versfilename
. Donc, la commande ne pourrait-elle pas être simplifiée (du moins pour moi, c'est plus simple)ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
option (a) doncls
il suffit de statuer les répertoires, et non de les lire, et (b) pour que la commande réussisse même si l'utilisateur n'a pas accès en lecture aux répertoires. (2) Je ne vois aucune raison d'utiliser,"$PWD/"
sauf pour se prémunir contre les répertoires dont les noms commencent par-
(et, bien sûr, il existe de meilleures façons de le faire).Je boucle:
La
break
provoque un court-circuit de la boucle, tout comme votre chaîne de&&
la source
Une boucle pourrait être plus élégante:
C'est Bash. Un plus portable est Sh. Là, vous pouvez utiliser le tableau de position:
Ensuite, pour boucler dessus, utilisez
"$@"
.la source
Pourquoi pas seulement:
la source
But I suspect there is a more elegant way of doing this
-a
: "-a
et-o
les opérateurs primaires binaires (...) ont été marqués comme obsolètes": pubs.opengroup.org/onlinepubs/9699919799test
(aka[
) trois fois ceci l'invoque une fois,Selon la question, deux fonctions shell portables qui testent l'existence et la non-existence de plusieurs répertoires:
Exemple:
la source
En nous appuyant sur la réponse de Glenn Jackman , nous pouvons tester la non-existence d'autres noms comme celui-ci:
J'avais l'habitude[ -e "$dir" ]
de tester s'il"$dir"
existe; c'est-à-dire, s'ildir5
existe mais est un fichier, le résultat estFalse
. Si vous voulez seulement tester si les noms du deuxième groupe sont des répertoires, utilisez[ -d "$dir" ]
, comme dans la première boucle.Puisque nous parlons de vérifier l'existence de choses dans le répertoire de travail actuel, il n'est probablement pas nécessaire de spécifier
$PWD/
les noms; fais justela source