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


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.