Рассмотреть возможность
echo \ # this is a comment
foo
Это дает:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
После некоторых поисков в Интернете я нашел решение DigitalRoss на дочернем сайте Stack Overflow. Так можно сделать
echo `: this is a comment` \
foo
или в качестве альтернативы
echo $(: this is a comment) \
foo
Однако DigitalRoss не объяснил, почему эти решения работают. Буду признателен за объяснение. Он ответил с комментарием:
Раньше была
goto
команда оболочки, которая разветвлялась на метки, указанные:
здесь.goto
Ушел , но вы все еще можете использовать: whatever
синтаксис ...:
это своего рода анализируемой комментарий в настоящее время.
Но мне бы хотелось больше подробностей и контекста, включая обсуждение переносимости.
Конечно, если у кого-то есть другие решения, это тоже будет хорошо.
Смотрите также предыдущий вопрос Как комментировать многострочные команды в скриптах оболочки? ,
Возьмите домой сообщение из обсуждения ниже. Это `: this is a comment`
просто замена команды. Результат : this is a comment
- ничто, и это помещается вместо `: this is a comment`
.
Лучший выбор следующий:
echo `# this is a comment` \
foo
make_FIND
скрипт, который строит длинный список аргументовfind
. Здесь, мотивация для создания этого чанка по чанку состоит в том, что каждый чанк происходит из тела цикла, но тот же стиль позволяет комментировать каждый чанк.Вы можете добиться этого, используя массивы Bash, например
Это определяет массив
$CMD
, а затем расширяет его. После раскрытия результирующая строка оценивается, поэтому в этом случаеecho foo
выполняется.Текст между
(
и)
определяет массив и подчиняется обычному синтаксису bash, поэтому все в строке после#
игнорируется.Примечание о сохранении указанных пробелов
${CMD[@]}
разворачивается в одну строку, которая является объединением всех элементов, разделенных пробелом. После раскрытия Bash затем анализирует строку в токены обычным способом (cf $ IFS ), что часто не то, что мы хотим.Напротив, если раскрытие заключено в двойные кавычки, т.
"${CMD[@]}"
Е. Каждый элемент в массиве сохраняется. Рассмотрим разницу междуhello world second item
и"hello world" "second item"
.Наглядный пример:
источник
${CMD[@]}
не расширяется до одной строки. - Он расширяется до множества строк: не только для каждого элемента массива, но и для пробелов в каждом элементе. (Не делать
$(: comment)
. Это не комментарий - это необолочка - еще один совершенно новый процесс оболочки для большинства оболочек. Ваша цель состоит в том, чтобы делать меньше с вашим вкладом, не больше, что бы это делало, даже если это бессмысленно.Вы можете вместо этого сделать ...
В основном то, что там происходит, это оболочка, которая делает замену. Он заменяет значение специального параметра оболочки
$-
дважды каждый раз. В любом случае это короткая строка, но она всегда установлена - и поэтому внутренняя подстановка - которая интерпретируется как шаблон для извлечения из внешнего - не распространяется на содержимое в скобках, когда я использую-
форму расширения.Вот:
Видеть? Так что это просто расширяется в два раза. Как только оболочка обнаружит, что параметр установлен, все в необязательном поле расширения в значительной степени отбрасывается и расширяется до целого значения, которое удаляется из самого себя и так до нуля. В большинстве оболочек вам даже не нужны кавычки, а
bash
требуется это.Еще лучше:
источник