Комментирование в 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) Так что скобки никогда не закрываются.

Обратные разборы обрабатываются по-разному и обнаруживают закрывающий обратный удар даже после #