Bloquear comentarios en un Script de Shell


¿Hay una forma sencilla de comentar un bloque de código en un script de shell?

 193
Author: A-B-B, 2009-06-04

10 answers

En bash:

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

El ' y ' alrededor del delimitador END son importantes, de lo contrario las cosas dentro del bloque como por ejemplo $(command) serán analizadas y ejecutadas.

Para una explicación, ver esta y esta pregunta.

 279
Author: sunny256,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-23 14:17:14

No hay ningún comentario de bloque en el script de shell.

Usando vi (sí, vi) puedes comentar fácilmente desde la línea n hasta m

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

(que se lee, de la línea 10 a 100 sustituir inicio de línea ( ^ ) con un signo#.)

Y un comentario con

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

(que se lee, de la línea 10 a la línea 100 sustituir inicio ( ^ ) seguido de # con la nota //.)

vi es casi universal en cualquier lugar donde hay /bin/sh.

 76
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-02 20:37:49

Puedes usar:

if [ 1 -eq 0 ]; then
  echo "The code that you want commented out goes here."
  echo "This echo statement will not be called."
fi
 41
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 15:45:55

Lo siguiente debería funcionar para sh,bash, ksh y zsh.

Los bloques de código a comentar se pueden poner dentro de BEGINCOMMENT y 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"

Ejecutar el código anterior resultaría en:

This is outside the commented block

Para descomentar los bloques de código así comentados, digamos

alias BEGINCOMMENT="if : ; then"

En lugar de

alias BEGINCOMMENT="if [ ]; then"

En el ejemplo anterior.

 22
Author: devnull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-11 11:20:06

Si puedes esquivar las comillas simples:

__='
blah blah comment.
'
 19
Author: vanvliet.eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-16 16:38:06

En Vim:

  1. ir a la primera línea del bloque que desea comentar
  2. shift-V (entrar en modo visual), arriba abajo resalte las líneas en el bloque
  3. ejecute lo siguiente en la selección :s/^/#/
  4. El comando se verá así:

      :'<,'>s/^/#
    
  5. Pulsa enter

Por ejemplo

shift-V
jjj
:s/^/#
<enter>
 14
Author: stefanB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 00:54:50

Puedes usar el modo de bloqueo visual de Vi/Vim que está diseñado para cosas como esta:

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

El comentario sería:

Ctrl-V  
Highlight #'s  
d  
l  

Esta es la forma interactiva de vi de hacer este tipo de cosas en lugar de contar o leer números de línea.

Por último, en Gvim se usa ctrl-q para entrar en el modo de bloqueo visual en lugar de ctrl-v (porque ese es el atajo para pegar).

 4
Author: horta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-06 23:02:14

Tanta sobreingeniería...

Considero realmente una mala práctica escribir código activo para generar código pasivo.

Mi solución: la mayoría de los editores tienen el modo de selección de bloques. Solo úsalo para agregar # a todas las líneas que quieras comentar. ¿Cuál es el problema?..

Ejemplo de bloc de notas:

Para crear: Alt - mousedrag down, pulse #.

Para eliminar: Alt-ratonera abajo, shift-flecha derecha, eliminar.

 2
Author: Rusty75,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-27 15:35:08

Una variación del truco de here-doc en la respuesta aceptada por sunny256 es usar las palabras clave de Perl para los comentarios. Si sus comentarios son en realidad algún tipo de documentación, puede comenzar a usar la sintaxis de Perl dentro del bloque comentado, que le permite imprimirlo con un formato agradable, convertirlo en una página de manual, etc.

En lo que respecta al shell, solo necesita reemplazar 'END' por '=cut'.

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

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

etc.

=cut
echo "after comment"

(Se encuentra en " Incrustando documentación en shell guión")

 1
Author: mivk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-15 11:04:10

Otro modo es: Si su editor NO TIENE opción DE comentario de BLOQUE,

  1. Abra una segunda instancia del editor (por ejemplo File=>New File...)
  2. Del archivo ANTERIOR en el que está trabajando, seleccione SOLO LA PARTE QUE DESEA COMENTAR
  3. Cópielo y péguelo en la ventana del nuevo archivo temporal...
  4. Abra el menú Editar, seleccione REEMPLAZAR e ingrese como cadena a reemplazar'\n '
  5. entrada como cadena de reemplazo: '\n# '
  6. presione el botón 'reemplazar TODOS "

HECHO

FUNCIONA con CUALQUIER editor

 0
Author: mardocheo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 13:23:17