Комментирование в скрипте Bash - PullRequest
142 голосов
/ 21 сентября 2009

Как мне прокомментировать каждую строку следующих строк из скрипта?

   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

Можно ли здесь комментировать?

Ответы [ 6 ]

178 голосов
/ 21 сентября 2009

Это будет иметь некоторые накладные расходы, но технически это действительно ответ на ваш вопрос:

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

См. Вопрос переполнения стека Как разместить комментарий к строке для многострочной команды .

37 голосов
/ 21 сентября 2009

Завершающий обратный слеш должен быть последним символом в строке, чтобы его можно было интерпретировать как команду продолжения. Никакие комментарии или даже пробелы после него не допускаются.

Вы должны быть в состоянии поместить строки комментариев между вашими командами

# 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}
5 голосов
/ 21 сентября 2009

Как указал DigitalRoss, завершающая обратная косая черта не требуется, когда строка заканчивается в |. И вы можете поместить комментарии в строку после |:

 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}
5 голосов
/ 21 сентября 2009

Обратная косая черта экранирует знак #, интерпретируя его как его буквенный символ вместо символа комментария.

4 голосов
/ 19 ноября 2017

$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 , который вызвал этот ответ.

0 голосов
/ 31 декабря 2017

Вот скрипт 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 
------------------------------------------------}
...