Комментирование набора строк в сценарии оболочки - PullRequest
49 голосов
/ 18 сентября 2009

Мне было интересно, есть ли способ закомментировать набор строк в сценарии оболочки. Как я мог это сделать? Мы можем использовать / * * / на других языках программирования. Это наиболее полезно, когда я конвертирую / использую / модифицирую другой скрипт и я хочу сохранить исходные строки вместо удаления.

Кажется сложной работой найти и поставить префикс # для всех неиспользуемых строк.

Допустим, в сценарии есть 100 строк в последующих строках, которые не должны использоваться. Я хочу прокомментировать их все за один раз. Это возможно?

Ответы [ 10 ]

46 голосов
/ 18 сентября 2009
if false
then

...code...

fi

false всегда возвращает false, поэтому код всегда будет пропущен.

44 голосов
/ 04 октября 2013

Самый универсальный и безопасный метод - поместить комментарий в цитату here-document, вот так:

<<"COMMENT"
    This long comment text includes ${parameter:=expansion}
    `command substitution` and $((arithmetic++ + --expansion)).
COMMENT

Кавычки COMMENT, указанные выше, необходимы для предотвращения параметра расширение, подстановка команд и арифметическое расширение, которое произойдет в противном случае, как указано в руководстве Bash , а стандарт оболочки POSIX указывает .

В случае, приведенном выше, отсутствие кавычек COMMENT приведет к переменной parameter присваивается текст expansion, если он был пуст или не задан, выполнение команды command substitution, увеличивая переменную arithmetic и уменьшая переменная expansion.

Сравнение других решений с этим:

Использование if false; then comment text fi требует, чтобы текст комментария был синтаксически правильный Bash-код, тогда как естественные комментарии часто нет, если только для возможных несбалансированных апострофов. То же самое касается : || { comment text } построить.

Помещение комментариев в аргумент команды void с одинарными кавычками, как в :'comment text', имеет недостаток невозможности включать апострофы. Дважды цитируемый аргументы, как в :"comment text", по-прежнему подлежат расширению параметра, подстановка команд и арифметическое расширение, то же, что и без кавычек здесь содержание документа и может привести к побочным эффектам, описанным выше.

Использование сценариев и средств редактирования для автоматического префикса каждой строки в Блок с '#' имеет некоторые достоинства, но не совсем отвечает на вопрос.

26 голосов
/ 10 июля 2013

Вы также можете разместить многострочные комментарии, используя:

: '
comment1comment1
comment2comment2
comment3comment3
comment4comment4
'

Согласно справочнику Bash для Встроенные оболочки Bourne Shell

: (двоеточие)

: [аргументы]

Ничего не предпринимайте, кроме расширения аргументов и выполнения перенаправлений. Статус возврата равен нулю.

Спасибо Ikram за указание на это в сообщении Сценарий оболочки поместил многострочный комментарий

20 голосов
/ 18 сентября 2009

Вы можете использовать документ «здесь» без команды, чтобы отправить его.

#!/bin/bash
echo "Say Something"
<<COMMENT1
    your comment 1
    comment 2
    blah
COMMENT1
echo "Do something else"

Справочник по Википедии

9 голосов
/ 18 сентября 2009

Текстовые редакторы имеют удивительную функцию под названием поиск и замена. Вы не говорите, какой редактор используете, но поскольку сценарии оболочки, как правило, * nix, а я использую VI, вот команда для комментирования строк с 20 по 50 какого-либо сценария оболочки:

:20,50s/^/#/
5 голосов
/ 18 декабря 2009
: || {
your code here
your code here
your code here
your code here
}
2 голосов
/ 08 ноября 2016

Что если вы просто включите свой код в функцию?

Итак, это:

cd ~/documents
mkdir test
echo "useless script" > about.txt

Становится так:

CommentedOutBlock() {
  cd ~/documents
  mkdir test
  echo "useless script" > about.txt
}
1 голос
/ 26 декабря 2016

Согласно этому сайту :

#!/bin/bash
foo=bar
: '
This is a test comment
Author foo bar
Released under GNU 
'

echo "Init..."
# rest of script
0 голосов
/ 18 сентября 2009

Этот однострочный Perl комментирует строки 1–3 файла orig.sh включительно (где первая строка пронумерована 0) и записывает закомментированную версию в cmt.sh.

perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh

Очевидно, что вы можете изменить граничные числа при необходимости.

Если вы хотите отредактировать файл на месте, он будет еще короче:

perl -in -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh

Демо

$ cat orig.sh 
a
b
c
d
e
f

$ perl -n -e '$s=1;$e=3; $_="#$_" if $i>=$s&&$i<=$e;print;$i++' orig.sh > cmt.sh

$ cat cmt.sh 
a
#b
#c
#d
e
f
0 голосов
/ 18 сентября 2009

В зависимости от редактора, который вы используете, есть несколько ярлыков для комментирования блока строк.

Еще один обходной путь - поместить ваш код в условный блок if (0);)

...