Я недавно начал изучать сценарий оболочки и хотел бы иметь возможность закомментировать набор строк в сценарии оболочки. То есть, как в случае с C / Java:

/* comment1
   comment2 
   comment3
*/`

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

Ответы (9)

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

Например:

: '
This is a
very neat comment
in bash
'

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

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

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's 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

Прочитав другие ответы здесь, я придумал следующее, из которого, ИМХО, действительно ясно, что это комментарий. Особенно подходит для информации об использовании в скрипте:

<< ////

Usage:
This script launches a spaceship to the moon. It's 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.

////

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

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

Note: I updated this answer based on comments and other answers, so comments prior to May 22nd 2020 may no longer apply. Also I noticed today that some IDE's like VS Code and PyCharm do not recognize a HEREDOC marker that contains spaces, whereas bash has no problem with it, so I'm updating this answer again.

Bash не предоставляет встроенный синтаксис для многострочного комментария, но есть хаки, использующие существующий синтаксис bash, которые «сейчас работают».

• 100001
<<'###BLOCK-COMMENT'
line 1
line 2

line 3
line 4
###BLOCK-COMMENT

Использование одинарных кавычек для маркера HEREDOC позволяет избежать некоторых побочных эффектов синтаксического анализа оболочки, таких как странные подстановки, которые могут вызвать сбой или вывод, и даже анализ самого маркера. Таким образом, одинарные кавычки дают вам больше свободы при использовании маркера комментариев «открыть-закрыть».

Например, в следующем примере используется тройной хэш, который предлагает многострочный комментарий в bash. Это привело бы к сбою скрипта, если бы одинарные кавычки отсутствовали. Даже если вы удалите ###, FOO {} приведет к сбою скрипта (или вызовет печать неправильной подстановки, если не set -e), если он не для одинарных кавычек:

set -e

<<'###BLOCK-COMMENT'
something something ${FOO{}} something
more comment
###BLOCK-COMMENT

ls

Вы, конечно, можете просто использовать

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

, но цель этого явно менее ясна читателю, незнакомому с этой уловкой.

Обратите внимание, что мой исходный ответ использовал '### BLOCK COMMENT', что нормально, если вы используете vanilla vi / vim, но сегодня я заметил, что PyCharm и VS Code не распознают закрывающий маркер, если он есть пробелы.

В настоящее время любой хороший редактор позволяет вам нажать ctrl- / или что-то подобное, чтобы снять / прокомментировать выделенный фрагмент. Это все точно понимают:

# something something ${FOO{}} something
# more comment
# yet another line of comment

хотя, по общему признанию, это не так удобно, как комментарий блока выше, если вы хотите повторно заполнить свои абзацы.

Конечно, есть и другие техники, но, похоже, нет «традиционного» способа сделать это. Было бы неплохо, если бы ###> и ### < можно было бы добавить в bash для обозначения начала и конца блока комментариев, кажется, это может быть довольно просто.

Multiline comment in 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

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

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

ls -l
date

'

в обычном bash закомментировать блок кода я делаю

: || { блокировать кода }

каково ваше мнение об этом?

function giveitauniquename()
{
  so this is a comment
  echo "there's 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
  }
}

Вот как я делаю многострочные комментарии в 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

2022 WebDevInsider