1. Резюме
Я не понимаю, зачем мне правило E010 bashate .
2. Детали
Я использую Bashate для Linting .sh
файлов. Правило E010:
делать не на той же линии, что и для
for
bashate:
Правильный:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
Ошибка:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
Есть ли веские аргументы, зачем мне for
и do
в одну строчку?
3. Не полезно
Я не могу найти ответ на свой вопрос в:
- Статьи о лучших практиках кодирования ( пример )
Bashate документация . Я нахожу только :
Набор правил, которые помогают поддерживать последовательность в блоках управления. Они игнорируются на длинных очередях, которые имеют продолжение, потому что развертывание, которое является «интересным»
bash
shell-script
Саша Черных
источник
источник
do
, безусловно, немного необычны, ноfor ... \ndo\n<indent>body...
чрезвычайно распространены, и я бы даже оценил больше, чемfor ... ; do
. Это также жалуется на это?bashate
это проверка стиля Стили по своей природе субъективны. Не используйте его, если вам не нравится стиль, который он навязывает. Вместо этого вы должны рассмотреть синтаксис / проверку ошибок как shellcheck .E010
- только стиль правило или в некоторых случаях мне нужно для и сделать в одной и той же линии , не только по причинам стиля.do
. Это как отступы открывающей фигурной скобкиif
и добавить код на ту же строку в языке , как C. Другого примера, если питон позволил это, было бы поставив:
вif
отступе на следующую строке и добавление кода на ту же строку. Это будет отличать его от дополнительных линий в теле.Ответы:
Синтаксически следующие два фрагмента кода являются правильными и эквивалентными:
Последнее можно было бы , возможно , можно сказать, будет труднее читать
do
немного запутывает команды в теле цикла. Если цикл содержит несколько команд, а следующая команда находится на новой строке, запутывание будет дополнительно выделено:... но помечать это как "ошибку" - ИМХО чье-то личное мнение, а не объективная истина.
В общем, почти любой
;
может быть заменен на новую строку. И;
новая, и новая строка являются командными терминаторами.do
это ключевое слово, которое означает «здесь следует то, что нужно сделать (в этомfor
цикле)».такой же как
и в качестве
Причиной использования одного над другим является удобочитаемость и местные / личные стили стиля.
Личное мнение:
В заголовках цикла, которые очень длинные , я думаю, что может иметь смысл поставить
do
новую строку, как вили
То же самое относится к
then
вif
заявлении.Но опять же, это сводится к личным предпочтениям стиля или к любому стилю кодирования, который использует ваша команда / проект.
источник
do
, я не вижу причины, по которой его размещение на следующей строке могло бы улучшить читаемость.do
(илиthen
) на отдельной строке (как в примере со второго по последний). Все это связано с личными предпочтениями. Мне не нравятся слишком длинные строки, отчасти потому, что мой терминал "всего" шириной 80 символов, а отчасти потому, что я думаю, что он выглядит неопрятно. Мне также трудно разбирать очень длинные строки на наличие ошибок.do
отдельной строке «error». Это довольно жесткие фразы, так что это действительно кажется , стоит того , чтобы указать на то , что, скорее, наоборот, так называемое «правило» на самом деле просто субъективное мнение.Обратите внимание на то, что написано в верхней части страницы:
PEP8 - это руководство по стилю для кода Python. В то время как Python люди часто кажется, берут свои проблемы стиля очень серьезно [править] , это как раз то, руководство. Мы могли бы придумать плюсы как для размещения
do
строки в одной строкеfor
, так и для собственной линии.Это та же дискуссия , где ставить
{
в коде C при запускеif
илиwhile
блок (или такой).Несколько строк ниже в документации, есть еще одно интересное правило:
Я предполагаю, что суть в том, что автор этого руководства по стилю считает, что использование
function
ключевого слова необходимо, чтобы читатель распознал объявление функции. Тем не менее,function foo
это нестандартный способ определения функции: стандартный способfoo()
. Единственное различие между ними (в Bash) состоит в том, что другое сложнее портировать на стандартную оболочку, как/bin/sh
в Debian или Ubuntu.Итак, я бы предложил взять все эти руководства по стилю с небольшим количеством соли или три, и решить для себя, какой стиль лучше. Хорошая проверка стиля позволяет отключить некоторые проверки (bashate должен
bashate -i E010,E011
игнорировать эти две проверки.) Отличная проверка стиля позволит вам изменить тесты, например, для проверки противоположности E020, здесь.источник
TL; DR: Вам не нужно. Это просто мнение какого-то чувака.
Как и многие другие, я писал
for
подобные циклы десятилетиями:Этот макет подчеркивает тот факт, что
do ... done
тело цикла окружено, как фигурные скобки в C-подобных языках, и позволяет символам новой строки разделять компоненты конструкции цикла.Конечно, существуют религиозные войны о том, где размещать фигурные скобки, так что вы могли бы сказать, что жюри все еще отсутствует в этом. ИМХО, это ясно, как это было разработано для работы; Борн увлекался подобранными разделителями, ср.
if ... fi
,case ... esac
И потребность в точку с запятой в короткой версии показывает , что вы делаете это меньше , чем первоначально разработан. Ничего плохого в этом нет; технологические достижения и многие вещи, которые когда-то казались хорошей идеей, теперь не одобряютсяgoto
. Но пока все сообщество сценариев оболочки не примет предпочтенияbashate
авторов, вам не нужно ничего делать.источник
fi
что соответствуетif
иesac
т. Д., Взято из Алгола 68. Единственная причина, по которойfor
циклdo
не заканчиваетсяod
,od
- это имя существующей стандартной утилиты. См en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unixbegin ... end
и т. Д.).od
, что это смешно ... (Хотя, почему бы тогда не закончить цикл "rof
?")BEGIN
иEND
там тоже определены.FOR
иDO
будет также по отдельным линиям, по соглашению, за исключением , когда весь цикл будет легко помещается на одной строке.Я удивлен, что никто еще не упомянул этот допустимый и переносимый синтаксис:
Обратите внимание, что
for
иdo
находятся на одной строке, без точки с запятой. Результат:источник
for q
иdo
находятся в отдельных строках (форма в этом примере не поддерживалась пару десятилетий назад в исходной оболочке Almquish (ash
): in-ulm.de/~mascheck/various/ bourne_args / # endnote )Несколько хороших ответов здесь. Всегда берите гидов по стилю с долей соли, и ИМХО, и опыт, будьте очень осторожны в отношении любого сообщества, которое изобилует чрезмерной догмой, когда дело касается стиля. Похоже, они верят, что когда они НАКОНЕЦ получат последнюю точку, которую я поставил, и эту последнюю букву Т, то программное обеспечение будет работать. Иногда для устранения ошибок требуется более чем идеальный стиль ...
Когда я начал изучать оболочку, большинство сценариев и текстов использовали встроенный формат точки с запятой
но поскольку я был неопытным, мне было немного трудно определить; и делать - оба необходимы для подтверждения синтаксической правильности. Поэтому я предпочел сделать на следующей строке все сам по себе. Я больше не делаю это (каламбур)
Кроме того, команда while является отличным кандидатом на небольшую хитрость:
но когда команды подготовки немного громоздки и / или условие сложное, его лучше отформатировать как
и затем добавление do как "; do" является явно ошибочным.
Вы можете даже стать более интенсивным, чем это:
потому что каждое утверждение является выражением. Обратите внимание, как оба стиля используются оппортунистически. Держите это в чистоте, и это вполне читабельно. Уплотните или перекосите его во имя стиля или «экономии места», и это станет ужасным беспорядком.
Так! Учитывая довольно барочные стили сценариев оболочки в целом, все, что направлено на повышение ясности и легкий визуальный доступ к значимым символам, всегда хорошо.
Форма, где «do» написана в строке с командой, приятна, когда у вас есть небольшая команда - я не нахожу «do» визуально скрытым, и внутренняя команда действительно не скрыта:
Я считаю, что на это довольно приятно смотреть, и у него есть аналоги с while, if и case:
Ясность и общая аккуратность - это все, что просит от вас Кодд *.
* Эдгар Ф. Кодд, отец теории реляционных баз данных.
источник
while
сif
условием раньше. Круто!