Le ;jeton est un séparateur de commande, tout comme la nouvelle ligne. Comme thenc'est une commande distincte, le point-virgule précédent est nécessaire pour pouvoir l'écrire dans la même ligne. Les points-virgules après mkdiret fisont superflus.
Andreas Riedmüller
Réponses:
278
Premièrement, dans bash "[" est juste une commande, qui attend la chaîne "]" comme dernier argument, donc l'espace avant le crochet fermant (ainsi qu'entre "!" Et "-d" qui doivent être deux arguments séparés aussi) est important:
Remarque: le -pdrapeau entraîne la création de tous les répertoires parents si nécessaire.
Danijel
13
Mon dieu, je n'ai jamais su que "[" était une commande. Cela explique tant de mes problèmes ... Facilement la chose la plus utile que j'ai jamais lue sur StackOverflow.
Ben Kushigian
1
Hou la la! Savoir que "[" est une commande dans bash est une telle révélation. J'ai l'impression que beaucoup de problèmes avec mes scripts bash sont maintenant résolus!
raluru
93
Il n'est en fait pas nécessaire de vérifier s'il existe ou non. Puisque vous voulez déjà le créer s'il existe, juste mkdir fera l'affaire
L'argument -pn'ignore pas exactement les erreurs: il appelle un mode différent dans lequel tous les composants de chemin qui n'existent pas sont créés (et par conséquent, ce n'est pas une erreur s'il se produit que zéro doit être créé). Le comportement est différent car il créera des composants autres que le dernier, ce qui peut être souhaitable ou non.
BeeOnRope
23
Vous avez besoin d'espaces entre les crochets [et ]:
#!/bin/bashif[!-d /home/mlzboy/b2c2/shared/db ]then
mkdir -p /home/mlzboy/b2c2/shared/db
fi
De manière plus propre, exploitez l'évaluation des raccourcis des opérateurs logiques du shell. Le côté droit de l'opérateur est exécuté uniquement si le côté gauche est vrai.
mmh, pas plus propre: juste plus court. Il est difficile de comprendre la signification d'une telle déclaration si vous la rencontrez.
Davide Orazio Montersino
1
J'aime cela, bien que l' -pargument rende la vérification inutile. Vous pouvez toujours l'utiliser lorsque vous ne souhaitez pas l'utiliser -p, c'est-à-dire lorsque vous ne souhaitez pas que tous les répertoires parents soient créés automatiquement.
ADTC
3
En fait, c'est encore plus court à écrire [ -d /path/to/dir ] || mkdir /path/to/dir. Le côté droit est exécuté lorsque le côté gauche est faux.
ADTC
4
Je pense que vous devriez reformater un peu votre code:
;
jeton est un séparateur de commande, tout comme la nouvelle ligne. Commethen
c'est une commande distincte, le point-virgule précédent est nécessaire pour pouvoir l'écrire dans la même ligne. Les points-virgules aprèsmkdir
etfi
sont superflus.Réponses:
Premièrement, dans bash "[" est juste une commande, qui attend la chaîne "]" comme dernier argument, donc l'espace avant le crochet fermant (ainsi qu'entre "!" Et "-d" qui doivent être deux arguments séparés aussi) est important:
Deuxièmement, puisque vous utilisez -p switch to
mkdir
, cette vérification est inutile, car c'est ce qui fait en premier lieu. Ecrivez:et c'est tout.
la source
-p
drapeau entraîne la création de tous les répertoires parents si nécessaire.Il n'est en fait pas nécessaire de vérifier s'il existe ou non. Puisque vous voulez déjà le créer s'il existe, juste mkdir fera l'affaire
la source
-p
drapeau entraîne la création de tous les répertoires parents si nécessaire.Faites simplement:
mkdir lancera une erreur si le dossier existe déjà. Pour ignorer les erreurs, écrivez:
Pas besoin de faire de vérification ou quoi que ce soit du genre.
Pour référence:
-p, --parents no error if existing, make parent directories as needed
http://man7.org/linux/man-pages/man1/mkdir.1.htmlla source
-p
n'ignore pas exactement les erreurs: il appelle un mode différent dans lequel tous les composants de chemin qui n'existent pas sont créés (et par conséquent, ce n'est pas une erreur s'il se produit que zéro doit être créé). Le comportement est différent car il créera des composants autres que le dernier, ce qui peut être souhaitable ou non.Vous avez besoin d'espaces entre les crochets
[
et]
:la source
De manière plus propre, exploitez l'évaluation des raccourcis des opérateurs logiques du shell. Le côté droit de l'opérateur est exécuté uniquement si le côté gauche est vrai.
la source
-p
argument rende la vérification inutile. Vous pouvez toujours l'utiliser lorsque vous ne souhaitez pas l'utiliser-p
, c'est-à-dire lorsque vous ne souhaitez pas que tous les répertoires parents soient créés automatiquement.[ -d /path/to/dir ] || mkdir /path/to/dir
. Le côté droit est exécuté lorsque le côté gauche est faux.Je pense que vous devriez reformater un peu votre code:
la source