Bloquear comentários em um script de shell


250

Existe uma maneira simples de comentar um bloco de código em um script de shell?


2
Interessante como essa pergunta fácil e simples tem respostas muito diferentes e complicadas.
Sigur 28/11

Respostas:


348

Na festança:

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

O delimitador 'e o 'contorno ENDsão importantes; caso contrário, coisas dentro do bloco, como por exemplo $(command), serão analisadas e executadas.

Para uma explicação, consulte esta e esta pergunta.


24
Truque fofo - desde que a palavra-chave 'END' (que é, obviamente, a escolhida pelo usuário) não apareça sozinha em uma linha dentro do material a ser comentado.
Jonathan Leffler

9
@kalengi: Sim; a palavra usada nas aspas pode ser qualquer coisa conveniente; EOFé um exemplo clássico (e assim é !, um ponto de exclamação em sua própria), mas você poderia usar SNURFLE_BURGERSou classical_end_markerou qualquer outra palavra que não aparece em uma linha por si próprio no material comentou-out. Eu gostaria de experimentar espaços etc, mas a palavra poderia muito bem trabalhar com eles também.
Jonathan Leffler

4
Definitivamente funciona, mas alguém pode explicar como isso funciona? Obrigado
mbbce

5
@MB_CE, consulte stackoverflow.com/questions/32126653/… . Dito isto - ele está executando um comando ( :) que não lê sua entrada e sempre sai com um valor bem-sucedido e envia o "comentário" como entrada. Não é muito.
Charles Duffy

2
Considero incrivelmente feio e confuso escrever código ativo para criar código passivo ... basta usar o bom e velho modo de seleção de bloco e pressionar #; qual é o grande problema com isso?
Rusty75

90

Não há nenhum comentário em bloco no shell script.

Usando vi(sim vi) , você pode comentar facilmente da linha n para m

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

(que lê, da linha 10 a 100, substitua o início da linha (^) pelo sinal #.)

e un comentário com

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

(que lê, da linha 10 a 100 substitua o início da linha (^) seguido de # com a anotação //.)

vié quase universal em qualquer lugar onde houver /bin/sh.


Bom truque com expressão regular no vi para colocar # na frente das linhas.
Atiq Rahman 07/03/2013

5
Apenas uma dica - se você estiver usando o vim e isso acabar destacando o início de cada linha, adicione |noh-o ao final. O pipe separa comandos adicionais e nohé para sem destaque. O destaque do termo de pesquisa será retomado automaticamente na próxima vez que você pesquisar algo. Exemplo::10,100s/^/#/g|noh
Matthew

Eu preciso que isso seja automatizado a partir de um script. Existe uma maneira de fazer isso em um arquivo com vi sem a necessidade de interação humana?
Timothy Swan

1
@ TimothySwan Eu imagino que o programa gawk ou sed poderia fazer isso ... de alguma forma.
precisa saber é o seguinte

minha maneira preferida de comentar (ou prefixar) um bloco com vi: vá para o início da linha que você deseja começar a comentar (por exemplo, <SHIFT>+G 10 <ENTER>então 0ou por qualquer outra maneira de navegar). Em seguida, use <CTRL>+Vpara entrar no modo de bloco visual e destacar o início de todas as linhas que você deseja comentar (neste exemplo 90 J). Em seguida, pressione SHIFT+Ipara inserir antes do bloco realçado. Digite o sinal de comentário (por exemplo #) e pressione <ESC>para concluir sua prefixação. Essa explicação parece super longa, mas, na minha experiência, é muito mais rápido na prática.
perfil completo de Ueffes

52

Você pode 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

14
Isso é clássico, mas, como observa stackoverflow.com/a/19409316/832230 , if [ ];também funciona.
Acumenus

12

3
Isso parece apenas funcionar: o texto comentado é realmente código. Tenho problemas com comentários com tubos e ponto e vírgula. Sunny256 resposta funcionou.
swdev

ainda mais conciso seria []; usando o teste que é
Justin Duncan

27

A seguir deve trabalhar para sh, bash, kshezsh .

Os blocos de código a serem comentados podem ser inseridos BEGINCOMMENTe 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"

A execução do código acima resultaria em:

This is outside the commented block

Para remover o comentário dos blocos de código comentados, digamos

alias BEGINCOMMENT="if : ; then"

ao invés de

alias BEGINCOMMENT="if [ ]; then"

no exemplo acima.


23

se você pode evitar as aspas simples:

__='
blah blah comment.
'

Eu gosto disso. O que o sublinhado duplo significa embora? O melhor que posso dizer é apenas um nome de variável usando a convenção de que deve ser tratado como privado?
Chessofnerd

Também fornece destaque de sintaxe na maioria dos editores e é possível chamar, se necessário, com $ __, embora eu sugira um nome de variável como documentação ou documentação para maior clareza.
Jasonleonhard

Você também pode anexar a palavra local na frente ref aqui
jasonleonhard

Essa deve ser a melhor resposta. Basta colocar algum nome variável dummy, em vez dos sublinhados duplos
B Abali

Tentei isso, mas falhei porque havia um -F ';' dentro do bloco para comentar.
yO_


14

No Vim:

  1. vá para a primeira linha do bloco que deseja comentar
  2. shift-V (entre no modo visual), suba para baixo as linhas de destaque no bloco
  3. execute o seguinte na seleção :s/^/#/
  4. o comando ficará assim:

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

por exemplo

shift-V
jjj
:s/^/#
<enter>

7
Para descomentar o uso:s/^#/
Buge

Verifique a resposta da @ horta: stackoverflow.com/a/28376319/3506015 - há ainda menos pressionamentos de tecla!
geedoubleya

4

Você pode usar o modo Visual Block do Vi / Vim, projetado para coisas como esta:

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

O comentário não seria:

Ctrl-V  
Highlight #'s  
d  
l  

Esta é a maneira interativa do vi de fazer esse tipo de coisa, em vez de contar ou ler os números das linhas.

Por fim, no Gvim, você usa ctrl-q para entrar no modo Visual Block em vez de ctrl-v (porque esse é o atalho para colar).


Adoro esse método simplista. : o)
geedoubleya

4

Com toda a honestidade, por que tanta engenharia ...

Considero realmente uma prática ruim escrever código ativo para gerar código passivo.

Minha solução: a maioria dos editores tem o modo de seleção de blocos. Basta usá-lo para adicionar # a todas as linhas que você deseja comentar. Qual é o grande problema ...

Exemplo do bloco de notas:

Para criar: Mantenha pressionada a tecla Alt, pressione #.

Para excluir: mantenha pressionada a tecla Alt pressionada, mova a seta para a direita e exclua.


8
O usuário provavelmente está no terminal. Não é possível assumir um ambiente de mouse.
18718 Gary

Eles ainda existem? Normalmente edito no modo gráfico e colo novamente usando o vi, que seria uma solução fácil.
Rusty75

2

Uma variação do truque aqui-doc na resposta aceita por sunny256 é usar as palavras-chave Perl para comentários. Se seus comentários são realmente algum tipo de documentação, você pode começar a usar a sintaxe Perl dentro do bloco comentado, o que permite imprimi-lo bem formatado, convertê-lo em uma página de manual etc.

No que diz respeito ao shell, você só precisa substituir 'END'por '=cut'.

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

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

etc.

=cut
echo "after comment"

(Encontrado em " Incorporando documentação no shell script ")


0

Outro modo é: Se o seu editor NÃO TEM opção de comentário em BLOCO,

  1. Abra uma segunda instância do editor (por exemplo, Arquivo => Novo arquivo ...)
  2. No arquivo ANTERIOR em que você está trabalhando, selecione APENAS A PARTE QUE VOCÊ QUER COMENTAR
  3. Copie e cole na janela do novo arquivo temporário ...
  4. Abra o menu Editar, selecione SUBSTITUIR e insira como sequência a ser substituída '\ n'
  5. entrada como string de substituição: '\ n #'
  6. pressione o botão 'substituir tudo'

FEITO

FUNCIONA com QUALQUER editor


0

Eu gosto de uma única linha abrir e fechar:

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

O '##' me ajuda a encontrar facilmente o início e o fim do comentário do bloco. Posso colar um número após o '##' se tiver vários deles. Para desativar o comentário, basta colocar um '1' no '[]'. Também evito alguns problemas que tive com aspas simples no bloco comentado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.