web-dev-qa-db-fra.com

Manière de créer des commentaires multilignes dans Bash?

J'ai récemment commencé à étudier le script Shell et j'aimerais pouvoir commenter un ensemble de lignes dans un script Shell. Je veux dire comme dans le cas de C/Java:

/* comment1
   comment2 
   comment3
*/`

Comment pourrais-je faire ça?

160

Utilisez : ' pour ouvrir et ' pour fermer.

Par exemple:

: '
This is a
very neat comment
in bash
'
290
Vegas

Commentaire multiligne dans bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT
108
David Okwii

Bash ne fournit pas d'intégré, mais il existe des hacks utilisant la syntaxe bash existante. Le plus simple consiste à utiliser un HEREDOC, mais expliquez clairement ce que vous faites et utilisez le même marqueur HEREDOC partout:

<< --MULTILINE-COMMENT--
line 1
line 2

line 3
line 4
--MULTILINE-COMMENT--

Certains articles mentionnent que le marqueur HEREDOC doit être cité afin d'éviter certains effets secondaires de l'analyse syntaxique de Shell. Je n'ai trouvé cela nécessaire que si vous utilisez des citations arrières dans votre commentaire. Même avec set -o verbose et $variables mentionnés dans le commentaire, il n'est pas nécessaire de citer le marqueur. YMMV.

Si vous utilisez l’approche : ' mentionnée dans une autre réponse, documentez-la via un méta-commentaire, utilisez le même méta-commentaire partout et n'oubliez pas de doubler toutes les occurrences de ' dans le commentaire ( un éditeur de coloration de syntaxe le rendra évident):

: 'Multiline comment:
line 1
line 2 we''re going to try this eventually
line 3
'

Les deux sont des hacks donc ils pourraient casser des scripts à l'avenir.

Il y a sûrement d'autres techniques, mais il ne semble pas y avoir de méthode "conventionnelle" pour le faire.

24
Oliver

Après avoir lu les autres réponses ici je suis venu avec le dessous, ce qui à mon avis est très clair c'est un commentaire. Particulièrement adapté aux informations d'utilisation dans le script:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

En tant que programmeur, la séquence de barres obliques est immédiatement enregistrée dans mon cerveau sous forme de commentaire (même si les barres obliques sont normalement utilisées pour les commentaires de ligne).

Bien sûr, "////" n'est qu'une chaîne; le nombre de barres obliques dans le préfixe et le suffixe doivent être égaux.

18
noamtm

quelle est votre opinion sur celui-ci?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}
3
Imre

Voici comment je fais des commentaires multilignes dans bash.

Ce mécanisme présente deux avantages que j'apprécie. La première est que les commentaires peuvent être imbriqués. L'autre est que les blocs peuvent être activés simplement en commentant la ligne de départ.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

Dans l'exemple ci-dessus, le bloc "B" est commenté, mais les parties du bloc "A" qui ne sont pas le bloc "B" ne sont pas commentées.

L'exécution de cet exemple produira cette sortie:

foo {
./example: line 5: fn: command not found
foo }
can't happen
2
bugi

# J'aime la paresse et la simplicité. J'utiliserais # avec une solution de contournement amusante:

1 PRESSE:] trouver ctrl + F ou cmd + F ou autre [pour déclencher la fonctionnalité de recherche

2 utilisez une expression rationnelle dans le champ de recherche tel que: (^.+)

3 remplacez par: # $1 ou si vous préférez #$1


# Remarque: vous n’avez peut-être pas les trois étapes dans votre éditeur. Dans ce cas, utilisez un outil de regex en ligne (vous ne pouvez pas en proposer une ici pour des raisons de stratégie):

  1. Sélectionnez, copiez le texte où que vous soyez et collez-le dans l'outil d'expression régulière en ligne.
  2. Utilisez (^.+) comme expression rationnelle et #$1 ou #\1 comme modèle de substitution
  3. Sélectionnez, copiez le texte et collez-le à l'endroit où vous avez commencé

# Profitez de vos hashes!

0
AMDP