Способ создания многострочных комментариев в Bash?

Недавно я начал изучать shell script, и я хотел бы иметь возможность прокомментировать набор строк в оболочке script. Я имею в виду, что это в случае C/Java:

/* comment1
   comment2 
   comment3
*/`

Как я могу это сделать?

Ответ 1

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

Например:

: '
This is a
very neat comment
in bash
'

Ответ 2

Многострочный комментарий в bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() '' commands would get executed:
$(gibberish command)
'rm -fr mydir'
comment1
comment2 
comment3
END_COMMENT

Ответ 3

Bash не предоставляет встроенного, но есть хаки, использующие существующий синтаксис bash. Самое простое - использовать HEREDOC, но сделайте очевидным, что вы делаете, и везде используйте один и тот же маркер HEREDOC:

<< --MULTILINE-COMMENT--
line 1
line 2

line 3
line 4
--MULTILINE-COMMENT--

В некоторых сообщениях упоминается, что маркер HEREDOC должен быть заключен в кавычки, чтобы избежать побочных эффектов при разборе оболочки. Я считаю, что это необходимо, только если вы используете обратные кавычки в своем комментарии. Даже с set -o verbose и $variables упомянутых в комментарии, set -o verbose маркер не обязательно. YMMV.

Если вы используете подход : ' упомянутый в другом ответе, то документируйте, что это такое, с помощью мета-комментария, везде используйте один и тот же мета-комментарий и не забывайте удваивать любые вхождения ' в комментарии (редактор раскраски синтаксиса сделает это очевидно):

: 'Multiline comment:
line 1
line 2 we''re going to try this eventually
line 3
'

Оба взломаны, поэтому в будущем могут нарушать работу сценариев.

Конечно, есть и другие методы, но, кажется, не существует "обычного" способа сделать это.

Ответ 4

Прочитав другие ответы здесь, я придумал ниже, что, IMHO, дает понять, что это комментарий. Особенно подходит для использования в скрипте:

<< ////

Usage:
This script launches a spaceship to the moon. It doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Как программист, последовательность косых черт немедленно записывается в моем мозгу в качестве комментария (хотя косые черты обычно используются для строковых комментариев).

Конечно, "////" это просто строка; количество косых черт в префиксе и суффиксе должно быть одинаковым.

Ответ 5

что вы думаете об этом?

function giveitauniquename()
{
  so this is a comment
  echo "there no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

Ответ 6

Вот как я делаю многострочные комментарии в bash.

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

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

В приведенном выше примере блок "B" закомментирован, но части блока "A", которые не являются блоком "B", не закомментированы.

Выполнение этого примера приведет к выводу:

foo {
./example: line 5: fn: command not found
foo }
can't happen

Ответ 7

Очень хорошие решения, но ни один из вариантов heredoc не идеален: status $? устанавливается в 0 после многострочного комментария heredoc. Как уже упоминалось в jm666, ничто не сравнится С# в каждой строке.

Ответ 8

Простое решение, не слишком умное:

Временно заблокируйте часть скрипта:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Немного сложная версия:

time_of_debug=false # Let set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

Ответ 9

Я попробовал выбранный ответ, но обнаружил, что при запуске сценария оболочки, имеющего его, все это выводилось на экран (подобно тому, как на ноутбуках Jupyter распечатывается все в кавычках '''xx'''), и в конце появлялось сообщение об ошибке. Он ничего не делал, но: страшно. Тогда я понял, редактируя его, что одинарные кавычки могут занимать несколько строк. Итак... давайте просто назначим блок переменной.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

Ответ 10

# Мне нравится лень и простота. Я бы использовал # с забавным обходным решением:

1 НАЖМИТЕ:] find ctrl + F или cmd + F или что-то еще [чтобы активировать функцию поиска

2 используйте регулярное выражение в поле поиска, например: (^.+)

3 замените на: # $1 или, если вы предпочитаете #$1


# Примечание: у вас может не быть трех шагов в вашем редакторе. В этом случае используйте онлайн-инструмент для регулярных выражений (не могу предложить его здесь по соображениям политики):

  1. Выберите, скопируйте текст, где бы вы ни находились, и вставьте его в онлайн-инструмент регулярных выражений.
  2. Используйте (^.+) качестве регулярного выражения и #$1 или #\1 качестве шаблонов замены
  3. Выберите, скопируйте текст и вставьте его туда, где вы начали

# Наслаждайтесь вашими хэшами!