Dans la réponse à cette question sur les commentaires dans les scripts shell , il est indiqué qu'il :
s'agit d'une commande null qui ne fait rien explicitement (mais ne doit pas être utilisée pour les commentaires).
Quelle serait l'utilité d'une commande qui ne fait absolument rien?
shell
shell-script
DQdlM
la source
la source
:
doit être intégrée, tandis que cetrue
n'est pas le cas, ce qui affecte la portée des variablesRéponses:
J'utilise généralement
true
en boucles; Je pense que c'est plus clair:Le seul endroit que j'ai trouvé
:
très utile est dans les déclarations de cas, si vous devez faire correspondre quelque chose mais que vous ne voulez rien faire. Par exemple:la source
true
pour une condition,:
pour un NOP.case a in a ) ;; esac
. Y a-t-il des obus qui n'acceptent pas cela?case ${var} in value);; *) do_something;; esac
est acceptable. La:
commande n'est pas nécessaire pour les cas vides.À l'origine, il a été utilisé pour déterminer qu'il s'agissait d'un programme shell Bourne, par opposition à un programme compilé en C. C'était avant shebang et plusieurs langages de script (csh, perl). Vous pouvez toujours exécuter un script commençant par
:
:Il exécutera généralement le script contre
$SHELL
(ou/bin/sh
).Depuis lors, l'utilisation principale est d'évaluer les arguments. J'utilise toujours:
pour définir une valeur par défaut dans un script.
la source
:
est utile pour écrire des boucles qui doivent être terminées de l'intérieur.Cela s'exécutera indéfiniment, sauf si
break
ouexit
est appelé, ou le shell reçoit un signal de terminaison.la source
while true; do ...; done
communique mieux les intentions au lecteur quewhile :; do ...; done
Lorsque vous voulez une instruction «à moins» dans les scripts shell, vous utilisez soit une condition «non», qui peut sembler loufoque pour certains des tests, soit vous utilisez «:» dans la clause true, avec du code réel dans la false- clause.
La "condition exotique" pourrait être quelque chose que vous ne voulez pas nier, ou c'est beaucoup plus clair si vous n'utilisez pas la "logique négative".
la source
autoconf
car il est beaucoup plus facile d'ajouter une valeur:
par défaut pour les branches vides que de comprendre comment inverser la condition.!
devant[ some-exotic-condition ]
est maladroit, mais un superflu: else
après ce n'est pas maladroit.!
jeton annule tout un élément de canal de commande.while ! grep ... ; do ... done
ouif ! [ ... ] ; then ... fi
. C'est essentiellement externe à latest/[]
syntaxe. Voir: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Je n'ai jamais utilisé cela en plus du caractère # pour commenter temporairement une ligne, dans une situation où le commentaire de la ligne produit une erreur de syntaxe, en raison d'un défaut dans la grammaire du shell de ne pas autoriser une séquence vide de commandes :
Sans: nous avons une séquence de commandes manquante, ce qui est une erreur de syntaxe.
la source
Il y a deux cas où je trouve
:
utile:Affectations de variables par défaut
Il s'agit d'un moyen pratique pour permettre aux utilisateurs de votre script shell de remplacer un paramètre sans modifier le script. (Cependant, les arguments de ligne de commande sont meilleurs car vous ne courez pas le risque d'un comportement inattendu si l'utilisateur possède par hasard la variable que vous utilisez dans son environnement exporté.) Voici comment l'utilisateur remplacerait le paramètre:
La
${VAR=value}
syntaxe dit ensembleVAR
àvalue
siVAR
ce n'est déjà, puis développez à la valeur de la variable. Comme nous ne nous soucions pas encore de la valeur de la variable, elle est passée en argument à la commande no-op:
pour la jeter.Même s'il
:
s'agit d'une commande no-op, l'expansion est effectuée par le shell (pas la:
commande!) Avant d'exécuter la:
commande afin que l'affectation des variables se produise toujours (le cas échéant).Il serait également acceptable d'utiliser
true
ou une autre commande à la place:
, mais le code devient plus difficile à lire car l'intention est moins claire.Le script suivant fonctionnerait également:
Mais ce qui précède est beaucoup plus difficile à maintenir. Si une ligne utilisant
${VAR}
est ajoutée au-dessus de cetteprintf
ligne, l'extension d'affectation par défaut doit être déplacée. Si le développeur oublie de déplacer cette affectation, un bogue est introduit.Quelque chose à mettre dans un bloc conditionnel vide
Les blocs conditionnels vides doivent généralement être évités, mais ils sont parfois utiles:
Certaines personnes soutiennent que le fait d'avoir un vrai
if
bloc vide peut rendre le code plus facile à lire que la négation du test. Par exemple:est sans doute plus facile à lire que:
Cependant, je pense qu'il existe quelques approches alternatives qui sont meilleures qu'un vrai bloc vide:
Mettez la condition dans une fonction:
Mettez la condition entre accolades (ou entre parenthèses, mais les parenthèses génèrent un processus de sous-shell et toutes les modifications apportées à l'environnement à l'intérieur du sous-shell ne seront pas visibles en dehors du sous-shell) avant de nier:
Utilisez
||
au lieu deif
:Je préfère cette approche lorsque la réaction est une simple ligne, telle que l'affirmation de conditions:
la source
Dans l'ancien shell pré-bourne dans les anciennes versions d'UNIX, la
:
commande était à l'origine destinée à spécifier les étiquettes pourgoto
(c'était une commande distincte qui enroule l'entrée à l'endroit où se trouve l'étiquette, donc les étiquettes ne pouvaient pas être une syntaxe distincte que le shell est au courant.if
était également une commande distincte.) Elle est rapidement devenue utilisée pour les commentaires, avant qu'il y ait une syntaxe de commentaire (a#
été utilisée pour le retour arrière) et ces jours-ci sont autant de compatibilité que tout.la source
En plus de l'utiliser comme une instruction qui ne fait rien, vous pouvez l'utiliser pour commenter des instructions individuelles en les transformant en arguments pour:.
la source
: echo write this line > myfile
il créera toujours un fichier vide.:
n'est PAS un mécanisme de commentaires adéquat.