199 votes

Commentez un script Bash à l'intérieur d'une commande multiligne

Comment commenter chaque ligne des lignes suivantes d'un script ?

cat ${MYSQLDUMP} | \
sed '1d' | \
tr ",;" "\n" | \
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

Si j'essaie d'ajouter un commentaire comme :

cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File

Je reçois :

#: not found

Est-il possible de commenter ici ?

247voto

DigitalRoss Points 80400

Cela entraînera des frais généraux, mais techniquement, cela répond à votre question :

echo abc `#Put your comment here` \
     def `#Another chance for a comment` \
     xyz, etc.

Et pour les pipelines en particulier, il existe une solution propre sans frais généraux :

echo abc |        # Normal comment OK here
     tr a-z A-Z | # Another normal comment OK here
     sort |       # The pipelines are automatically continued
     uniq         # Final comment

Voir la question de Stack Overflow Comment placer un commentaire de ligne pour une commande multi-lignes ? .

44voto

mob Points 61524

La barre oblique inverse doit être le dernier caractère de la ligne pour qu'elle soit interprétée comme une commande de continuation. Aucun commentaire ou espace blanc n'est autorisé après la barre oblique inverse.

Vous devriez pouvoir mettre des lignes de commentaires entre vos commandes

# output MYSQLDUMP file
cat ${MYSQLDUMP} | \
# simplify the line
sed '/created_at/d' | \
# create some newlines
tr ",;" "\n" | \
# use some sed magic
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
# more magic
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
# even more magic
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
# I hate phone numbers in my output
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \ 
# one more sed call and then send it to the CSV file
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

8voto

mob Points 61524

Comme l'a souligné DigitalRoss, la barre oblique inverse n'est pas nécessaire lorsque la ligne se termine par | . Et vous pouvez mettre des commentaires sur une ligne suivant un | :

 cat ${MYSQLDUMP} |         # Output MYSQLDUMP file
 sed '1d' |                 # skip the top line
 tr ",;" "\n" | 
 sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' |
 sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' |
 sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' |
 tr "\n" "," |
 sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' |   # hate phone numbers
 sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

6voto

Tom Hale Points 5950

$IFS commentaires

Ce piratage utilise expansion des paramètres sur $IFS qui est utilisé pour séparer les mots dans les commandes :

$ echo foo${IFS}bar
foo bar

De même :

$ echo foo${IFS#comment}bar
foo bar

Grâce à cela, vous pouvez mettre un commentaire sur une ligne de commande en continu :

$ echo foo${IFS# Comment here} \
> bar
foo bar

mais le commentaire devra être placé avant le \ suite.

Notez que l'expansion des paramètres est effectuée à l'intérieur du commentaire :

$ ls file
ls: cannot access 'file': No such file or directory
$ echo foo${IFS# This command will create file: $(touch file)}bar
foo bar
$ ls file
file

Rare exception

Le seul cas rare d'échec est celui où $IFS qui a débuté précédemment avec le texte exact qui est supprimée par l'expansion (c'est-à-dire après que le # ) :

$ IFS=x
$ echo foo${IFS#y}bar
foo bar
$ echo foo${IFS#x}bar
foobar

Notez que la fin de l'article foobar n'a pas d'espace, ce qui illustre le problème.

Depuis $IFS ne contient que des espaces blancs par défaut, c'est extrêmement Il est peu probable que vous rencontriez ce problème.


Crédit à Commentaire de @pjh qui est à l'origine de cette réponse.

6voto

wisbucky Points 829

Outre les exemples donnés par DigitalRoss, voici un autre formulaire que vous pouvez utiliser si vous le souhaitez $() à la place des backticks `

echo abc $(: comment) \
     def $(: comment) \
     xyz

Bien entendu, vous pouvez également utiliser la syntaxe des deux points avec les barres obliques :

echo abc `: comment` \
     def `: comment` \
     xyz

Notes complémentaires

La raison $(#comment) ne fonctionne pas, c'est parce qu'une fois qu'il voit le # il traite le reste de la ligne comme des commentaires, y compris les parenthèses fermantes : comment) . La parenthèse n'est donc jamais fermée.

Les backticks sont analysés différemment et détecteront le backtick de fermeture même après un # .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X