Комментирование в Bash script
Как я могу прокомментировать каждую строку следующих строк из скрипта?
cat ${MYSQLDUMP} | \
sed '1d' | \
tr ",;" "\n" | \
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}
Если я попытаюсь добавить комментарий как:
cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File
Я получил:
#: not found
Здесь можно прокомментировать?
Ответы
Ответ 1
У этого будут некоторые накладные расходы, но технически он отвечает на ваш вопрос:
echo abc `#Put your comment here` \
def `#Another chance for a comment` \
xyz, etc.
И для конкретных трубопроводов существует чистое решение без накладных расходов:
echo abc | # Normal comment OK here
tr a-z A-Z | # Another normal comment OK here
sort | # The pipelines are automatically continued
uniq # Final comment
См. вопрос Как добавить комментарий к строке для многострочной команды.
Ответ 2
Конечная обратная косая черта должна быть последним символом в строке, чтобы она интерпретировалась как команда продолжения. После него не допускаются комментарии или даже пробелы.
Вы должны иметь возможность помещать строки комментариев между вашими командами
# output MYSQLDUMP file
cat ${MYSQLDUMP} | \
# simplify the line
sed '/created_at/d' | \
# create some newlines
tr ",;" "\n" | \
# use some sed magic
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
# more magic
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
# even more magic
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
# I hate phone numbers in my output
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
# one more sed call and then send it to the CSV file
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}
Ответ 3
Как отметил DigitalRoss, обратная косая черта назад не нужна, когда линия woud заканчивается на |
. И вы можете добавлять комментарии к строке, следующей за |
:
cat ${MYSQLDUMP} | # Output MYSQLDUMP file
sed '1d' | # skip the top line
tr ",;" "\n" |
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' |
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' |
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' |
tr "\n" "," |
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | # hate phone numbers
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}
Ответ 4
Обратная косая черта исключает #, интерпретируя ее как свой буквенный символ вместо символа комментария.
Ответ 5
$IFS
комментарии хаки
В этом хаке используется расширение параметра на $IFS
, которое используется для разделения слов в командах:
$ echo foo${IFS}bar
foo bar
Аналогично:
$ echo foo${IFS#comment}bar
foo bar
Используя это, вы можете поместить комментарий в командной строке с контуром:
$ echo foo${IFS# Comment here} \
> bar
foo bar
но комментарий должен быть до продолжения \
.
Обратите внимание, что расширение параметра выполняется внутри комментария:
$ ls file
ls: cannot access 'file': No such file or directory
$ echo foo${IFS# This command will create file: $(touch file)}bar
foo bar
$ ls file
file
Редкое исключение
Единственный редкий случай, когда это не удается, - это если $IFS
ранее начинался с точного текста, который удаляется через расширение (т.е. после символа #
):
$ IFS=x
$ echo foo${IFS#y}bar
foo bar
$ echo foo${IFS#x}bar
foobar
Обратите внимание, что окончательный foobar
не имеет места, иллюстрирующий проблему.
Так как $IFS
содержит только пробелы по умолчанию, крайне маловероятно, что вы столкнетесь с этой проблемой.
Кредит @pjh комментарий, который вызвал этот ответ.
Ответ 6
Вот сценарий bash, который объединяет идеи и идиомы нескольких предыдущих комментариев, чтобы представить с примерами встроенные комментарии, имеющие общий вид ${__+ <comment text>}
.
Особенно
-
<comment text>
может быть многострочным -
<comment text>
не расширен параметр - никакие подпроцессы не генерируются (поэтому комментарии эффективны)
Существует одно ограничение на <comment text>
, а именно: неуравновешенные фигурные скобки '}'
и круглые скобки ')'
должны быть защищены (например, '\}'
и '\)'
).
В локальной среде bash есть одно требование:
- имя параметра
__
должно быть отменено
Любое другое синтаксически действительное имя параметра bash будет использоваться вместо __
, если имя не имеет установленного значения.
Ниже приведен пример сценария
# provide bash inline comments having the form
# <code> ${__+ <comment>} <code>
# <code> ${__+ <multiline
# comment>} <code>
# utility routines that obviate "useless use of cat"
function bashcat { printf '%s\n' "$(</dev/stdin)"; }
function scat { 1>&2 bashcat; exit 1; }
# ensure that '__' is unset && remains unset
[[ -z ${__+x} ]] && # if '__' is unset
declare -r __ || # then ensure that '__' remains unset
scat <<EOF # else exit with an error
Error: the parameter __='${__}' is set, hence the
comment-idiom '\${__+ <comment text>}' will fail
EOF
${__+ (example of inline comments)
------------------------------------------------
the following inline comment-idiom is supported
<code> ${__+ <comment>} <code>
<code> ${__+ <multiline
comment>} <code>
(advisory) the parameter '__' must NOT be set;
even the null declaration __='' will fail
(advisory) protect unbalanced delimiters \} and \)
(advisory) NO parameter-expansion of <comment>
(advisory) NO subprocesses are spawned
(advisory) a functionally equivalent idiom is
<code> '# <comment>' <code>
<code> '# <multiline
comment>' <code>
however each comment spawns a bash subprocess
that inelegantly requires ~1ms of computation
------------------------------------------------}
Ответ 7
В дополнение к примерам от DigitalRoss, здесь есть другая форма, которую вы можете использовать, если предпочитаете $()
вместо backticks '
echo abc $(: comment) \
def $(: comment) \
xyz
Конечно, вы можете использовать синтаксис двоеточия с обратными галочками:
echo abc ': comment' \
def ': comment' \
xyz
Дополнительные примечания
Причина, по которой $(#comment)
не работает, заключается в том, что, увидев символ #
, он обрабатывает оставшуюся часть строки как комментарии, включая закрывающие скобки: comment)
Так что скобки никогда не закрываются.
Обратные разборы обрабатываются по-разному и обнаруживают закрывающий обратный удар даже после #