web-dev-qa-db-fra.com

Commenter dans un script Bash

Comment puis-je 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 en disant " cat $ {MYSQLDUMP} |\#Output MYSQLDUMP File ", j'obtiens:

Supprimer: non trouvé

Est-il possible de commenter ici ou pas à cause de "| \"?

130
BassKozz

Cela aura 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 relative au dépassement de capacité Comment insérer un commentaire de ligne pour une commande multiligne.

164
DigitalRoss

La barre oblique inverse de fin doit être le dernier caractère de la ligne pour être interprétée comme une commande de continuation. Aucun commentaire ou même des espaces ne sont autorisés après.

Vous devriez pouvoir insérer des lignes de commentaire 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}
34
mob

Comme l'a souligné DigitalRoss, la barre oblique inverse de fin n'est pas nécessaire lorsque la ligne se termine par |. Et vous pouvez mettre des commentaires sur une ligne après 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}
5
mob

La barre oblique inverse échappe au # et l'interprète comme son caractère littéral au lieu d'un caractère de commentaire.

4
tobiasvl

En plus des exemples de DigitalRoss, voici un autre formulaire que vous pouvez utiliser si vous préférez $() à la place des backticks `

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

Bien sûr, vous pouvez aussi utiliser la syntaxe du côlon avec des backticks:

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

Notes complémentaires

La raison pour laquelle $(#comment) ne fonctionne pas est qu'une fois qu'il voit le #, il traite le reste de la ligne comme des commentaires, y compris les parenthèses fermantes: comment). Donc, les parenthèses ne sont jamais fermées.

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

1
wisbucky

Voici un script bash qui combine les idées et les idiomes de plusieurs commentaires précédents pour fournir, avec des exemples, des commentaires en ligne ayant la forme générale ${__+ <comment text>}

En particulier

  • <comment text> peut être multiligne 
  • <comment text> n'est pas développé en paramètre
  • aucun sous-processus n'est généré (les commentaires sont donc efficaces)

Il existe une restriction au <comment text>, à savoir que les accolades non équilibrées '}' et les parenthèses ')' doivent être protégées (c'est-à-dire, '\}' et '\)').

Il existe une exigence sur l'environnement bash local:

  • le nom du paramètre __ doit être désactivé

Tout autre nom de paramètre bash syntaxiquement valide sera utilisé à la place de __, à condition que le nom n'ait pas de valeur définie.

Un exemple de script suit

# provide bash inline comments having the form
#     <code> ${__+ <comment>} <code> 
#     <code> ${__+ <multiline
#                   comment>} <code>

# utility routines that obviate "useless use of cat"
function bashcat { printf '%s\n' "$(</dev/stdin)"; }
function scat { 1>&2 bashcat; exit 1; }

# ensure that '__' is unset && remains unset
[[ -z ${__+x} ]] &&  # if '__' is unset
  declare -r __ ||   # then ensure that '__' remains unset 
  scat <<EOF         # else exit with an error
Error: the parameter __='${__}' is set, hence the
  comment-idiom '\${__+ <comment text>}' will fail
EOF

${__+ (example of inline comments)
------------------------------------------------
the following inline comment-idiom is supported
    <code> ${__+ <comment>} <code> 
    <code> ${__+ <multiline
                  comment>} <code> 
(advisory) the parameter '__' must NOT be set;
  even the null declaration __='' will fail
(advisory) protect unbalanced delimiters \} and \) 
(advisory) NO parameter-expansion of <comment> 
(advisory) NO subprocesses are spawned
(advisory) a functionally equivalent idiom is 
    <code> `# <comment>` <code> 
    <code> `# <multiline
               comment>` <code>
however each comment spawns a bash subprocess
that inelegantly requires ~1ms of computation 
------------------------------------------------}
0
John Sidles