Блокувати коментарі в сценарії оболонки


250

Чи є простий спосіб прокоментувати блок коду в сценарії оболонки?


2
Цікаво, як на таке легке та просте запитання є занадто різні та складні відповіді.
Сигур

Відповіді:


348

У басі:

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

Роздільник 'та 'навколо нього ENDважливі, інакше всередині блоку, наприклад, $(command)буде проаналізовано та виконано.

Для пояснення див. Це та це запитання.


24
Милий трюк - доки ключове слово "END" (яке, звичайно, обрано користувачем) не з’явиться на рядку самостійно всередині матеріалу, який слід коментувати.
Джонатан Леффлер

9
@kalengi: Так; слово, яке використовується в лапках, може бути будь-яким зручним; EOFє класичним прикладом (і тому !, знак оклику сам по собі), але ви можете використовувати SNURFLE_BURGERSабо classical_end_markerчи будь-яке інше слово , яке не відображається на лінії по собі в закоментувавши матеріалу. Я б схилявся експериментувати з пробілами тощо, але це слово може спрацювати і з ними.
Джонатан Леффлер

4
Це безумовно працює, але чи може хто-небудь детальніше розповісти, як це працює? Спасибі
mbbce

5
@MB_CE см stackoverflow.com/questions/32126653 / ... . Сказане - це запущення команди ( :), яка не читає вхід і завжди завершує успішне значення, і надсилає "коментар" як вхід. Не дуже до цього.
Чарльз Даффі

2
Я вважаю це неймовірно некрасивим і заплутаним для написання активного коду для створення пасивного коду ... просто використовуйте старий добрий режим вибору блоку та натисніть #; яка велика проблема з цим?
Rusty75

90

Немає коментарів щодо блоку скрипту оболонки.

Використовуючи vi(так, vi) ви можете легко коментувати з рядка n до m

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

(що читається, від рядка 10 до 100 починається рядок замінника (^) зі знаком #.)

і не коментуйте с

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

(що читає, з рядка 10 до 100 заміна рядка початку (^), а потім # із зазначенням //.)

viмайже універсальний у будь-якому місці, де є /bin/sh.


Гарний трюк з регулярним виразом на vi, щоб розмістити # перед рядками.
Атік Рахман

5
Лише підказка - якщо ви використовуєте vim, і це закінчується виділенням початку кожного рядка, додайте |nohйого до кінця. Труба відокремлює додаткові команди і nohпризначена для нікого світла. Підсвічування пошукових термінів автоматично відновиться під час наступного пошуку. Приклад::10,100s/^/#/g|noh
Матвій

Мені потрібно, щоб це було автоматизовано зі сценарію. Чи є спосіб зробити це у файлі з vi, не потребуючи взаємодії з людиною?
Тимофій Лебедь

1
@TimothySwan Я думаю, що програма gawk або sed могла це зробити ... якось.
BeowulfNode42

мій бажаний спосіб коментування (або префіксації) блоку з vi: перейдіть до початку рядка, який ви хочете почати коментувати (наприклад, <SHIFT>+G 10 <ENTER>тоді 0або будь-яким іншим способом навігації). Потім використовуйте <CTRL>+Vдля входу в режим візуального блоку та виділіть початок усіх рядків, які ви хочете коментувати (у цьому прикладі 90 J). Потім натисніть, SHIFT+Iщоб вставити перед виділеним блоком. Введіть знак коментаря (наприклад #) та натисніть, <ESC>щоб закінчити префіксацію. Це пояснення звучить надто довго, але, на мій досвід, це набагато швидше на практиці.
Ueffes

52

Ви можете використовувати:

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
Це класично, але, як зазначає stackoverflow.com/a/19409316/832230 , просто if [ ];також працює.
Acumenus

12
Може бути , ясніше: if false;. stackoverflow.com/a/18019516/2097284
Camille Goudeseune

3
Це здається лише тим, що коментований текст - це фактично код. У мене виникають проблеми з коментарями з трубами та крапками з комою. Відповідь Sunny256 спрацювала.
swdev

ще більш лаконічним було б []; використовуючи тест, який є
Justin Duncan

27

Наступні повинні працювати sh, bash, kshі zsh.

Блоки коду, який слід коментувати, можна помістити всередину BEGINCOMMENTта 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"

Виконання вищевказаного коду призведе до:

This is outside the commented block

Для того , щоб розкоментувати блоки коду таким чином прокоментував, слово

alias BEGINCOMMENT="if : ; then"

замість

alias BEGINCOMMENT="if [ ]; then"

у наведеному вище прикладі.


23

якщо ви можете ухилитися від одинарних лапок:

__='
blah blah comment.
'

Мені подобається це. Що означає подвійне підкреслення? Як найкраще я можу сказати, що це просто ім'я змінної з використанням конвенції, що до неї слід ставитися як до приватної?
chessofnerd

Також надає підкреслення синтаксису у більшості редакторів і його можна викликати, якщо потрібно, за допомогою $ __, хоча я б запропонував назву змінної, наприклад, документацію або документи для наочності.
jasonleonhard

Ви також можете додати слово "місцевий" перед посиланням тут
jasonleonhard

Це має бути найкращою відповіддю. Просто поставте назву змінної змінної замість подвійних підкреслень
B Abali

Спробував це, але не вдалося, оскільки був -F ​​';' всередині блоку для коментарів.
yO_


14

У Vim:

  1. перейдіть до першого рядка блоку, який ви хочете прокоментувати
  2. shift-V (увійти в візуальний режим), вгору висвітлити лінії в блоці
  3. виконати наступне під час вибору :s/^/#/
  4. команда буде виглядати приблизно так:

      :'<,'>s/^/#
  5. натисніть Enter

напр

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

7
Для використання без коментарів:s/^#/
Buge

Перевірте відповідь @ horta: stackoverflow.com/a/28376319/3506015 - ще менше натискань клавіш!
geedoubleya

4

Ви можете використовувати режим Visual Block Vi / Vim, розроблений для таких матеріалів:

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

Відмова буде:

Ctrl-V  
Highlight #'s  
d  
l  

Це інтерактивний спосіб vi робити такі речі, а не рахувати чи читати номери рядків.

Нарешті, у Gvim ви використовуєте ctrl-q, щоб перейти в режим візуального блоку, а не ctrl-v (адже це ярлик для вставки).


Любіть цей спрощений метод. : o)
geedoubleya

4

Чесно кажучи, чому так багато переобладнання ...

Я вважаю дійсно поганою практикою писати активний код для генерації пасивного коду.

Моє рішення: більшість редакторів мають режим вибору блоку. Просто використовуйте його, щоб додати # до всіх рядків, які ви хочете прокоментувати. У чому головна справа ...

Приклад блокнота:

Щоб створити: Alt - мишею, натисніть #.

Щоб видалити: Alt-mousedrag вниз, стрілка shift вправо, видалити.


8
Користувач, швидше за все, знаходиться в терміналі. Неможливо припустити середовище миші.
Гері

Чи існують вони ще? Зазвичай я редагую в графічному режимі і вставляю назад за допомогою vi, це було б легким вирішенням.
Rusty75

2

Варіант хитрії тут-doc у прийнятій до відповіді Sunny256 відповіді полягає у використанні ключових слів Perl для коментарів. Якщо ваші коментарі насправді є якоюсь документацією, ви можете почати використовувати синтаксис Perl всередині коментованого блоку, що дозволяє роздрукувати його добре відформатованого, перетворити його на довідкову сторінку тощо.

Що стосується оболонки , то, що вам потрібно тільки замінити 'END'з '=cut'.

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

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

etc.

=cut
echo "after comment"

(Знайдено в розділі " Вставлення документації в сценарій оболонки ")


0

Інший режим: Якщо ваш редактор НЕ БЛОКУВАТЬ опцію коментарів,

  1. Відкрийте другий примірник редактора (наприклад, Файл => Новий файл ...)
  2. З попереднього файла, над яким ви працюєте, виберіть ТІЛЬКІСТЬ, ЩО ВИ ХОЧЕТЕ КОМЕНТАРИ
  3. Скопіюйте та вставте його у вікно нового тимчасового файлу ...
  4. Відкрийте меню «Правка», виберіть ЗАМОВИТИ та введіть як рядок, який потрібно замінити '\ n'
  5. введіть як рядок заміни: '\ n #'
  6. натисніть кнопку "замінити ВСІ"

Зроблено

він працює з будь-яким редактором


0

Мені подобається, що один рядок відкривається та закривається:

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

"##" допомагає мені легко знайти початок і кінець коментаря до блоку. Я можу вставити номер після "##", якщо у мене є купа. Щоб вимкнути коментар, я просто вставлю "1" у "[]". Я також уникаю деяких проблем, які виникали з цитатами в коментованому блоці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.