Bloquer les commentaires dans un script shell

250

Existe-t-il un moyen simple de commenter un bloc de code dans un script shell?

ilscallmemorty
la source
2
Intéressant de voir comment une question aussi simple et facile a des réponses trop différentes et trop compliquées.
Sigur

Réponses:

348

En bash:

#!/bin/bash
echo before comment
: <<'END'
bla bla
blurfl
END
echo after comment

Le 'et 'autour du ENDdélimiteur sont importants, sinon les choses à l'intérieur du bloc comme par exemple $(command)seront analysées et exécutées.

Pour une explication, voir ceci et cette question.

ensoleillé256
la source
24
Astuce mignonne - tant que le mot-clé «END» (qui est, bien sûr, choisi par l'utilisateur) n'apparaît pas sur une ligne à l'intérieur du matériau à commenter.
Jonathan Leffler
9
@kalengi: Oui; le mot utilisé dans les guillemets peut être quelque chose de commode; EOFest un exemple classique (tout comme !un point d'exclamation en lui-même), mais vous pouvez utiliser SNURFLE_BURGERSou classical_end_markerou tout autre mot qui n'apparaît pas seul sur une ligne dans le texte commenté. J'apprendrais à expérimenter des espaces, etc., mais le mot pourrait bien fonctionner avec eux aussi.
Jonathan Leffler
4
Cela fonctionne certainement, mais quelqu'un peut-il expliquer comment cela fonctionne? Merci
mbbce
5
@MB_CE, voir stackoverflow.com/questions/32126653/… . Cela dit - il exécute une commande ( :) qui ne lit pas son entrée et se termine toujours avec une valeur réussie, et envoie le "commentaire" en entrée. Pas grand chose.
Charles Duffy
2
Je considère qu'il est incroyablement laid et déroutant d'écrire du code actif pour créer du code passif ... utilisez simplement le bon vieux mode de sélection de bloc et appuyez sur #; quel est le gros problème avec ça?
Rusty75
90

Il n'y a pas de commentaire de bloc sur le script shell.

En utilisant vi(oui vi), vous pouvez facilement commenter à partir de la ligne n à m

<ESC>
:10,100s/^/#/

(qui se lit, de la ligne 10 à 100, remplacer le début de la ligne (^) par un signe #.)

et un commentaire avec

<ESC>
:10,100s/^#//

(qui lit, de la ligne 10 à 100, le début de la ligne de remplacement (^) suivi de # en notant //.)

viest presque universel partout où il y a /bin/sh.

OscarRyz
la source
Belle astuce avec une expression régulière sur vi pour placer # devant les lignes.
Atiq Rahman
5
Juste un conseil - si vous utilisez vim et que cela finit par mettre en évidence le début de chaque ligne, ajoutez |nohà la fin. Le tuyau sépare les commandes supplémentaires et nohn'est destiné à aucun surlignage. La mise en évidence des termes de recherche reprendra automatiquement la prochaine fois que vous rechercherez quelque chose. Exemple::10,100s/^/#/g|noh
Matthew
J'ai besoin que cela soit automatisé à partir d'un script. Existe-t-il un moyen de le faire dans un fichier avec vi sans avoir besoin d'une interaction humaine?
Timothy Swan
1
@ TimothySwan J'imagine que le programme gawk ou sed pourrait faire ça ... d'une manière ou d'une autre.
BeowulfNode42
ma façon préférée de commenter (ou de préfixer) un bloc avec vi: aller au début de la ligne que vous souhaitez commencer à commenter (par exemple <SHIFT>+G 10 <ENTER>alors 0ou par tout autre moyen pour naviguer). Utilisez ensuite <CTRL>+Vpour entrer en mode de blocage visuel et mettez en surbrillance le début de toutes les lignes que vous souhaitez commenter (dans cet exemple 90 J). Appuyez ensuite sur SHIFT+Ipour insérer avant le bloc en surbrillance. Entrez le signe du commentaire (par exemple #) et appuyez sur <ESC>pour terminer votre préfixe. Cette explication semble super longue, mais d'après mon expérience, elle est beaucoup plus rapide dans la pratique.
Ueffes
52

Vous pouvez utiliser:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi
dannyhan12
la source
14
C'est classique, mais comme le note stackoverflow.com/a/19409316/832230 , çaif [ ]; marche aussi.
Acumenus
12
Peut-être plus clair: if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune
3
Cela ne semble fonctionner que si le texte commenté est en fait du code. Je rencontre des problèmes avec les commentaires avec les tuyaux et les points-virgules. La réponse du Sunny256 a fonctionné.
swdev
encore plus concis serait []; en utilisant le test qui est
Justin Duncan
27

Ce qui suit devrait fonctionner pour sh, bash, kshet zsh.

Les blocs de code à commenter peuvent être placés à l'intérieur BEGINCOMMENTet ENDCOMMENT:

[ -z $BASH ] || shopt -s expand_aliases
alias BEGINCOMMENT="if [ ]; then"
alias ENDCOMMENT="fi"

BEGINCOMMENT
  echo "This line appears in a commented block"
  echo "And this one too!"
ENDCOMMENT

echo "This is outside the commented block"

L'exécution du code ci-dessus entraînerait:

This is outside the commented block

Afin de décommenter les blocs de code ainsi commentés, disons

alias BEGINCOMMENT="if : ; then"

au lieu de

alias BEGINCOMMENT="if [ ]; then"

dans l'exemple ci-dessus.

devnull
la source
23

si vous pouvez esquiver les guillemets simples:

__='
blah blah comment.
'
vanvliet.eric
la source
J'aime ça. Mais que signifie le double soulignement? Autant que je sache, ce n'est qu'un nom de variable utilisant la convention selon laquelle il doit être traité comme privé?
chessofnerd
Fournit également la coloration syntaxique dans la plupart des éditeurs et peut être appelé si nécessaire avec $ __, bien que je suggère un nom de variable comme la documentation ou les documents pour plus de clarté.
jasonleonhard
Vous pouvez également ajouter le mot local devant ref ici
jasonleonhard
Ce devrait être la meilleure réponse. Il suffit de mettre un nom de variable fictive au lieu des doubles soulignements
B Abali
J'ai essayé, mais j'ai échoué car il y avait un -F ';' à l'intérieur du bloc pour commenter.
y__
15

Utilisez : 'pour ouvrir et 'fermer.

Par exemple:

: '
This is a
very neat comment
in bash
'

Ceci est de l'exemple de Vegas trouvé ici

Relative0
la source
2
hack-ish, mais génial
Gergely Lukacsy
c'est le meilleur pour moi.
DPalharini
14

À Vim:

  1. aller à la première ligne du bloc que vous souhaitez commenter
  2. shift-V (entrer en mode visuel), haut en bas des lignes de surbrillance dans le bloc
  3. exécuter ce qui suit lors de la sélection :s/^/#/
  4. la commande ressemblera à ceci:

      :'<,'>s/^/#
  5. appuyez sur Entrée

par exemple

shift-V
jjj
:s/^/#
<enter>
stefanB
la source
7
Pour décommenter l'utilisation:s/^#/
Buge
Vérifiez la réponse de @ horta: stackoverflow.com/a/28376319/3506015 - il y a encore moins d' appuis sur les touches!
geedoubleya
4

Vous pouvez utiliser le mode Visual Block de Vi / Vim qui est conçu pour des choses comme ceci:

Ctrl-V  
Highlight first element in rows you want commented  
Shift-i  
#  
esc  

Uncommentaire serait:

Ctrl-V  
Highlight #'s  
d  
l  

C'est la manière interactive de vi de faire ce genre de chose plutôt que de compter ou de lire les numéros de ligne.

Enfin, dans Gvim, vous utilisez ctrl-q pour passer en mode Visual Block plutôt que ctrl-v (car c'est le raccourci pour coller).

Horta
la source
J'adore cette méthode simpliste. : o)
geedoubleya
4

En toute honnêteté, pourquoi tant de suringénierie ...

Je considère que c'est vraiment une mauvaise pratique d'écrire du code actif pour générer du code passif.

Ma solution: la plupart des éditeurs ont un mode de sélection de bloc. Utilisez-le simplement pour ajouter # à toutes les lignes que vous souhaitez commenter. Quel est le gros problème ...

Exemple de bloc-notes:

Pour créer: Alt - mousedrag down, appuyez sur #.

Pour supprimer: Alt-mousedrag vers le bas, flèche vers la droite, supprimer.

Rusty75
la source
8
L'utilisateur est probablement dans le terminal. Ne peut pas assumer un environnement de souris.
Gary
Existent-ils encore? Je modifie généralement en mode graphique et je recolle en utilisant vi, ce serait une solution de contournement facile.
Rusty75
2

Une variante de l'astuce here-doc dans la réponse acceptée par sunny256 consiste à utiliser les mots clés Perl pour les commentaires. Si vos commentaires sont en fait une sorte de documentation, vous pouvez alors commencer à utiliser la syntaxe Perl à l'intérieur du bloc commenté, qui vous permet de l'imprimer correctement, de le convertir en page de manuel, etc.

En ce qui concerne le shell, il vous suffit de le remplacer 'END'par '=cut'.

echo "before comment"
: <<'=cut'
=pod

=head1 NAME
   podtest.sh - Example shell script with embedded POD documentation

etc.

=cut
echo "after comment"

(Trouvé sur " Intégrer la documentation dans le script shell ")

mivk
la source
0

Un autre mode est le suivant: si votre éditeur N'A PAS de commentaire BLOC,

  1. Ouvrez une deuxième instance de l'éditeur (par exemple Fichier => Nouveau fichier ...)
  2. Dans le fichier précédent sur lequel vous travaillez, sélectionnez UNIQUEMENT LA PARTIE QUE VOUS VOULEZ COMMENTER
  3. Copiez et collez-le dans la fenêtre du nouveau fichier temporaire ...
  4. Ouvrez le menu Edition, sélectionnez REMPLACER et saisissez comme chaîne à remplacer '\ n'
  5. entrée comme chaîne de remplacement: '\ n #'
  6. appuyez sur le bouton 'remplacer TOUT'

TERMINÉ

cela fonctionne avec n'importe quel éditeur

mardocheo
la source
0

J'aime une seule ligne ouverte et fermée:

if [ ]; then ##
    ...
    ...
fi; ##

Le '##' m'aide à trouver facilement le début et la fin du commentaire de bloc. Je peux coller un nombre après le '##' si j'en ai un tas. Pour désactiver le commentaire, je colle simplement un «1» dans le «[]». J'évite également certains problèmes que j'ai rencontrés avec les guillemets simples dans le bloc commenté.

Ynnub
la source