Блокировать комментарии в сценарии оболочки

250

Есть ли простой способ закомментировать блок кода в сценарии оболочки?

theycallmemorty
источник
2
Интересно, как на такой легкий и простой вопрос слишком разные и сложные ответы.
Сигур

Ответы:

348

В Баш:

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

Символ 'и 'вокруг ENDразделителя важен, иначе вещи внутри блока, такие как, например, $(command)будут проанализированы и выполнены.

Для объяснения см. Этот и этот вопрос.

sunny256
источник
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.

OscarRyz
источник
Хороший трюк с регулярным выражением на 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
dannyhan12
источник
14
Это классика, но, как отмечает stackoverflow.com/a/19409316/832230 , просто if [ ];также работает.
Acumenus
13
Возможно, понятнее if false;. stackoverflow.com/a/18019516/2097284
Камиль Гудесюн
3
Это только кажется, работает только то, что закомментированный текст на самом деле код. Я сталкиваюсь с проблемами с комментариями с трубами и точками с запятой. Sunny256 ответ сработал.
swdev
еще более кратким будет []; используя тест, который
Джастин Дункан
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"

в приведенном выше примере.

devnull
источник
23

если вы можете увернуться от одинарных кавычек:

__='
blah blah comment.
'
vanvliet.eric
источник
Мне это нравится. Что означает двойное подчеркивание? Насколько я могу судить, это просто имя переменной в соответствии с соглашением, что оно должно рассматриваться как личное?
chessofnerd
Также обеспечивает подсветку синтаксиса в большинстве редакторов и может вызываться при необходимости с помощью $ __, хотя для ясности я бы предложил имя переменной, например документацию или документацию.
Джейсон Леонард
Вы также можете добавить слово local перед
ссылкой
Это должен быть лучший ответ. Просто поместите несколько фиктивных переменных вместо двойных подчеркиваний
B Abali
Пробовал это, но не получилось, потому что был -F ';' внутри блока, чтобы закомментировать.
yO_
15

Используйте, : 'чтобы открыть и 'закрыть.

Например:

: '
This is a
very neat comment
in bash
'

Это из примера Вегаса, найденного здесь

Relative0
источник
2
взломать, но
круто
это лучший для меня.
DPalharini
14

В Vim:

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

      :'<,'>s/^/#
  5. нажмите ввод

например

shift-V
jjj
:s/^/#
<enter>
stefanB
источник
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 для перехода в режим Visual Block, а не ctrl-v (потому что это ярлык для вставки).

Орта
источник
Люблю этот упрощенный метод. : o)
geedoubleya
4

Честно говоря, почему так много перерабатывающих ...

Я считаю плохой практикой писать активный код для генерации пассивного кода.

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

Пример блокнота:

Для создания: Alt - mousedrag вниз, нажмите #.

Для удаления: Alt-mousedrag вниз, стрелка вправо, удалить.

Rusty75
источник
8
Пользователь, скорее всего, находится в терминале. Невозможно принять среду мыши.
Гари
Они все еще существуют? Я обычно редактирую в графическом режиме и вставляю обратно, используя vi, это было бы легко обойти.
Rusty75
2

Разновидностью хитрости здесь-документа в принятом ответе sunny256 является использование ключевых слов Perl для комментариев. Если ваши комментарии на самом деле представляют собой какую-то документацию, вы можете начать использовать синтаксис Perl внутри закомментированного блока, что позволит вам распечатать его красиво отформатированным, преобразовать в man-страницу и т. Д.

Что касается оболочки, вам нужно только заменить 'END'на '=cut'.

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

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

etc.

=cut
echo "after comment"

(Найдено в разделе « Внедрение документации в сценарий оболочки »)

mivk
источник
0

Другой режим: если ваш редактор не имеет опции комментариев BLOCK,

  1. Откройте второй экземпляр редактора (например, File => New File ...)
  2. Из ПРЕДЫДУЩЕГО файла, над которым вы работаете, выберите ТОЛЬКО ЧАСТЬ, КОТОРУЮ ВЫ ХОТИТЕ
  3. Скопируйте и вставьте его в окно нового временного файла ...
  4. Откройте меню «Правка», выберите «ЗАМЕНИТЬ» и введите в качестве строки для замены «\ n»
  5. введите как заменяющую строку: '\ n #'
  6. нажмите кнопку «заменить ВСЕ»

СДЕЛАНО

это работает с любым редактором

mardocheo
источник
0

Мне нравится одна строка открывать и закрывать:

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

«##» помогает мне легко найти начало и конец комментария к блоку. Я могу поставить число после «##», если у меня их будет куча. Чтобы отключить комментарий, я просто вставляю «1» в «[]». Я также избегаю некоторых проблем с одиночными кавычками в комментируемом блоке.

Ynnub
источник