Недавно я начал изучать shell script, и я хотел бы иметь возможность прокомментировать набор строк в оболочке script. Я имею в виду, что это в случае C/Java:
/* comment1
comment2
comment3
*/`
Как я могу это сделать?
Недавно я начал изучать shell script, и я хотел бы иметь возможность прокомментировать набор строк в оболочке script. Я имею в виду, что это в случае C/Java:
/* comment1
comment2
comment3
*/`
Как я могу это сделать?
Используйте : '
открыть" и '
закрыть".
Например:
: '
This is a
very neat comment
in bash
'
Многострочный комментарий в 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
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
'
Оба взломаны, поэтому в будущем могут нарушать работу сценариев.
Конечно, есть и другие методы, но, кажется, не существует "обычного" способа сделать это.
Прочитав другие ответы здесь, я придумал ниже, что, 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.
////
Как программист, последовательность косых черт немедленно записывается в моем мозгу в качестве комментария (хотя косые черты обычно используются для строковых комментариев).
Конечно, "////"
это просто строка; количество косых черт в префиксе и суффиксе должно быть одинаковым.
что вы думаете об этом?
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
}
}
Вот как я делаю многострочные комментарии в 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
Очень хорошие решения, но ни один из вариантов heredoc не идеален: status $? устанавливается в 0 после многострочного комментария heredoc. Как уже упоминалось в jm666, ничто не сравнится С# в каждой строке.
Простое решение, не слишком умное:
Временно заблокируйте часть скрипта:
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
Я попробовал выбранный ответ, но обнаружил, что при запуске сценария оболочки, имеющего его, все это выводилось на экран (подобно тому, как на ноутбуках Jupyter распечатывается все в кавычках '''xx'''
), и в конце появлялось сообщение об ошибке. Он ничего не делал, но: страшно. Тогда я понял, редактируя его, что одинарные кавычки могут занимать несколько строк. Итак... давайте просто назначим блок переменной.
x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"
ls -l
date
'
# Мне нравится лень и простота. Я бы использовал # с забавным обходным решением:
1 НАЖМИТЕ:] find ctrl + F или cmd + F или что-то еще [чтобы активировать функцию поиска
2 используйте регулярное выражение в поле поиска, например: (^.+)
3 замените на: # $1
или, если вы предпочитаете #$1
# Примечание: у вас может не быть трех шагов в вашем редакторе. В этом случае используйте онлайн-инструмент для регулярных выражений (не могу предложить его здесь по соображениям политики):
(^.+)
качестве регулярного выражения и #$1
или #\1
качестве шаблонов замены# Наслаждайтесь вашими хэшами!