В ответе на этот вопрос о комментариях в сценариях оболочки указано, :
что это пустая команда, которая явно ничего не делает (но не должна использоваться для комментариев).
Какова была бы полезность команды, которая абсолютно ничего не делает?
shell
shell-script
DQdlM
источник
источник
:
требуется , чтобы быть встроенным, аtrue
не так , что влияет на объем переменныхОтветы:
Я обычно использую
true
в петлях; Я думаю, что это более понятно:Единственное место, которое я нашел, что
:
действительно удобно, это операторы case, если вам нужно что-то сопоставить, но вы не хотите ничего делать. Например:источник
true
для условия,:
для NOP.case a in a ) ;; esac
. Есть ли снаряды, которые этого не принимают?case ${var} in value);; *) do_something;; esac
это приемлемо. Команда:
не нужна для пустых случаев.Первоначально он использовался для определения того, что это была программа оболочки Bourne, а не скомпилированная программа C. Это было до shebang и нескольких языков сценариев (csh, perl). Вы все еще можете запустить скрипт, начинающийся с
:
:Как правило, он запускает скрипт против
$SHELL
(или/bin/sh
).С тех пор основным использованием является оценка аргументов. Я все еще использую:
установить значение по умолчанию в скрипте.
источник
:
полезно для написания циклов, которые должны заканчиваться изнутри.Это будет продолжаться вечно, пока не будет вызван
break
либоexit
вызов, либо оболочка получит сигнал завершения.источник
while true; do ...; done
сообщает о своих намерениях читателю лучше, чемwhile :; do ...; done
Когда вы хотите использовать выражение "never" в сценариях оболочки, вы либо используете условие "not", которое может показаться глупым для некоторых тестов, либо вы используете ':' в предложении true, с реальным кодом в false- пункт.
«Экзотическое состояние» может быть чем-то, что вы не хотите отрицать, или это будет намного понятнее, если вы не используете «негативную логику».
источник
autoconf
потому, что гораздо проще добавить значение:
по умолчанию для пустых ветвей, чем выяснить, как отменить условие.!
впереди[ some-exotic-condition ]
глупо, но излишне: else
после этого не глупо.!
Маркер сводит на нет всю команду элемент трубы.while ! grep ... ; do ... done
илиif ! [ ... ] ; then ... fi
. Это в основном внешний по отношению кtest/[]
синтаксису. См .: pubs.opengroup.org/onlinepubs/9699919799/utilities/…Я использовал это только в дополнение к символу # для временного комментирования строки, в ситуации, когда комментирование строки приводит к синтаксической ошибке из-за дефекта в грамматике оболочки, из-за которого не допускается пустая последовательность команд :
Без: у нас отсутствует последовательность команд, что является синтаксической ошибкой.
источник
Есть два случая, когда я нахожу
:
полезным:Переменные по умолчанию
Это удобный способ разрешить пользователям вашего сценария оболочки изменять настройки без редактирования сценария. (Тем не менее, аргументы командной строки лучше, потому что вы не рискуете непредвиденного поведения, если у пользователя случайно есть переменная, которую вы используете в своей экспортированной среде.) Вот как пользователь переопределит параметр:
${VAR=value}
Синтаксис говорит наборVAR
дляvalue
еслиVAR
еще не установлен, а затем расширить до значения переменной. Поскольку нам пока не важно значение переменной, она передается в качестве аргумента команде no-op,:
чтобы выбросить ее.Несмотря на то,
:
что это команда no-op, расширение выполняется оболочкой (а не:
командой!) Перед выполнением:
команды, поэтому назначение переменной все еще происходит (если применимо).Также было бы приемлемо использовать
true
или какую-то другую команду вместо:
, но код становится труднее читать, потому что цель менее ясна.Следующий скрипт также будет работать:
Но вышесказанное гораздо сложнее поддерживать. Если
${VAR}
над этойprintf
строкой добавлена строка с использованием, расширение по умолчанию должно быть перемещено. Если разработчик забывает перенести это назначение, появляется ошибка.Что-то положить в пустой условный блок
Пустых условных блоков обычно следует избегать, но иногда они полезны:
Некоторые люди утверждают, что наличие пустого истинного
if
блока может облегчить чтение кода, чем отрицание теста. Например:легче читать, чем:
Однако я считаю, что есть несколько альтернативных подходов, которые лучше, чем пустой блок:
Поместите условие в функцию:
Поместите условие в фигурные скобки (или круглые скобки, но скобки порождают процесс подоболочки, и любые изменения, внесенные в среду внутри подоболочки, не будут видны за пределами подоболочки) перед отрицанием:
Используйте
||
вместоif
:Я предпочитаю такой подход, когда реакция простая однострочная, такая как утверждение условий:
источник
В старой оболочке pre-bourne в древних версиях UNIX
:
команда изначально предназначалась для указания меток дляgoto
(это была отдельная команда, которая сворачивает ввод туда, где находится метка, поэтому метки не могли быть отдельным синтаксисом, который shell знает о.if
была также отдельной командой.) Вскоре она стала использоваться для комментариев, до того, как появился синтаксис комментариев (#
использовался для возврата), и в наши дни для обеспечения совместимости практически ничего.источник
В дополнение к использованию в качестве оператора, который ничего не делает, вы можете использовать его для закомментирования отдельных операторов, превращая их в аргументы для:.
источник
: echo write this line > myfile
все равно создаст пустой файл.:
является НЕ адекватный механизм комментирования.