колотите много команду строки с комментариями после символа продолжения

Суммируйте размер каталога с убывающим человеческим размером

du -hs */ | sort -hr

например.

10.2G   foo/
4M      bar/
30
23.05.2017, 15:40
3 ответа

Конец комментариев в первой новой строке (см. маркерное правило 10 распознавания оболочки), не позволяя строки продолжения, таким образом, этот код имеет foo в отдельной командной строке:

echo # this is a comment \
foo

Что касается Вашего первого предложения, обратная косая черта не сопровождается новой строкой, Вы просто заключаете пространство в кавычки: это эквивалентно

echo ' # this is a comment'
foo

$(: this is a comment) заменяет выводом команды : this is a comment. Если вывод той команды пуст, это - эффективно очень запутывающий способ вставить комментарий посреди строки.

Нет никакого волшебного продолжения: : обычная команда, утилита двоеточия, которая ничего не делает. Утилита двоеточия главным образом полезна, когда синтаксис оболочки требует команды, но Вам, оказывается, нечего делать.

# Sample code to compress files that don't look compressed
case "$1" in
  *.gz|*.tgz|*.bz2|*.zip|*.jar|*.od?) :;; # the file is already compressed
  *) bzip2 -9 "$1";;
esac

Другой вариант использования является идиомой для установки переменной, если это уже не установлено.

: "${foo:=default value}"

Комментарий о goto является историческим. Утилита двоеточия датируется от даже перед Оболочкой Bourne, полностью к оболочке Thompson, которая имела goto инструкцию. Двоеточие затем означало маркировку; двоеточие является довольно общим синтаксисом для маркировок goto (оно все еще присутствует в sed).

26
27.01.2020, 19:38
  • 1
    Хорошо, я вижу. Есть ли кто-либо лучшие способы вставить комментарии в этот контекст, что Вы знаете? –  Faheem Mitha 21.08.2011, 19:05
  • 2
    @FaheemMitha, Как рекомендуется в потоке Вы цитируете: разбейте свою команду в управляемые блоки и прокомментируйте каждый блок. Если Ваша команда является столь сложной, что нуждается в комментарии в середине, пора упростить его! –  Gilles 'SO- stop being evil' 21.08.2011, 19:15
  • 3
    Ну, рассматриваемая команда имеет много аргументов... Это преобразовывает набор видеофайлов в один файл. Я не вижу прямой способ упростить его. Возможно, создайте какой-то список, и передайте его как аргумент? Я предполагаю, что это могло быть другим вопросом. –  Faheem Mitha 21.08.2011, 19:19
  • 4
    @FaheemMitha страницы: make_FIND, беглый сценарий, который создает длинный список аргументов find. Здесь, мотивация для создания его разделяет на блоки блоком, то, что каждый блок прибывает из тела цикла, но тот же стиль позволяет комментировать каждый блок. –  Gilles 'SO- stop being evil' 21.08.2011, 20:46
  • 5
    Спасибо за пример. Моим примером является в основном просто длинный список имен, данных как аргументы команде. Я хочу комментарии, присоединенные к каждому имени, потому что это - большая часть простого способа ко мне сохранить контекст. Я не вижу очевидного способа разбить команду в части, и если бы я сделал, то это могло бы сделать его еще дольше, и это уже достаточно длинно. –  Faheem Mitha 21.08.2011, 21:42

Этого можно добиться с помощью массивов Bash, например,

#!/bin/bash
CMD=(
  echo  # this is a comment
  foo
  )

"${CMD[@]}"

Это определяет массив, $CMD, а затем расширяет его. После разворачивания вычисляется результирующая строка, и в этом случае выполняется echo foo.

Текст между ( и ) определяет массив и подчиняется обычному синтаксису bash, поэтому все в строке после # игнорируется.

Заметка о сохранении пробела в кавычках

${CMD[@]} расширяется до строки single, которая представляет собой конкатенцию всех элементов, разделенных пробелом. После разворачивания Бэш разобрал бы строку на токены обычным способом (c.f $IFS), что часто не является тем, что мы хотим.

Напротив, если разложение обёрнуто в двойные кавычки, т.е. "${CMD[@]}", то каждый элемент в массиве сохраняется. Рассмотрим разницу между hello world second item и "hello world" "second item".

Illustrative example:

# LIST=("hello world" "second item")

# for ITEM in ${LIST[@]}; do echo $ITEM; done
hello
world
second
item

# for ITEM in "${LIST[@]}"; do echo $ITEM; done
hello world
second item
7
27.01.2020, 19:38

Не делайте $ (: comment) . Это не комментарий - это подоболочка - еще один совершенно новый процесс оболочки для большинства оболочек. Ваша цель состоит в том, чтобы делать меньше с вашим вкладом, а не больше, что и будет делать - даже если это бессмысленно.

Вместо этого вы можете сделать ...

printf '<%s>\n' some args here ${-##*"${--

                my long comment block

                }"}  and "more ${-##*"${--

                and another one in the
                middle of the quoted string
                there shouldn\'t b\e any special &
                (character) `echo issues here i hope >&2`
                basically anything that isn\'t a close \}
                $(echo the shell is looking for one >&2)
                }$(echo "}'"\" need backslash escaping >&2
                                )${-##*${--

                nesting is cool though

             }}"}here too"

}'" need backslash escaping
<some>
<args>
<here>
<and>
<more here too>

По сути, там происходит то, что оболочка выполняет подстановку. Он заменяет значение специального параметра оболочки $ - дважды каждый раз. В любом случае это короткая строка, но она всегда установлена ​​- и поэтому внутренняя подстановка - которая интерпретируется как образец для отделения от внешней - не расширяется до содержимого между скобки, когда я использую форму раскрытия - .

Здесь:

bash -x <<""
printf %s\\n '${-##*"'${-- a set param doesn\'t expand to this optional text }'"}'

+ printf '%s\n' '${-##*"hxB"}'
${-##*"hxB"}

Видите? Так что он просто расширился дважды. Как только оболочка обнаруживает, что параметр установлен, все в необязательном поле расширения отбрасывается, в значительной степени, и оно расширяется до своего целого значения, которое удаляется из самого себя и, таким образом, вообще до нуля. В большинстве оболочек вам не нужны даже escape-кавычки, но bash требует этого.

Еще лучше:

COMMENT=
echo      ${COMMENT-"
           this will work the same way
           but the stripping isn\'t
           necessary because, while
           the variable is set, it is also
           empty, and so it will expand to
           its value - which is nothing
           "} this you\'ll see

this you'll see
5
27.01.2020, 19:38

Теги

Похожие вопросы