1. Resumo
Não entendo, por que preciso da regra bashate E010 .
2. Detalhes
Eu uso bashate para .sh
arquivos linting. Regra E010:
não na mesma linha que para
for
bashar:
Correto:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
Erro:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
Existe algum argumento válido, por que preciso for
e do
na mesma linha?
3. Não é útil
Não consigo encontrar uma resposta para minha pergunta em:
- Artigos sobre as melhores práticas de codificação ( exemplo )
documentação do bashate . encontro apenas :
Um conjunto de regras que ajudam a manter as coisas consistentes nos blocos de controle. Estes são ignorados em linhas longas que têm uma continuação, porque desenrolar isso é meio “interessante”
Sintaticamente, os dois trechos de código a seguir são corretos e equivalentes:
Pode-se dizer que o último é mais difícil de ler, pois
do
ofusca ligeiramente o comando no corpo do loop. Se o loop contiver vários comandos e o próximo comando estiver em uma nova linha, a ofuscação será ainda mais destacada:... mas sinalizá-lo como um "erro" é IMHO a opinião pessoal de alguém, e não uma verdade objetiva.
Eu diria que se você quiser preceder o comando no loop com
do
, sinta-se à vontade para fazê-lo se isso tornar o código consistente e legível aos olhos de quem estiver lendo o código.Em geral, quase qualquer um
;
pode ser substituído por uma nova linha. Ambos;
e nova linha são terminadores de comando.do
é uma palavra-chave que significa "aqui segue o que precisa ser feito (nestefor
loop)".é o mesmo que
e como
e
A razão para usar um sobre o outro é a legibilidade e as convenções de estilo locais/pessoais.
Opinião pessoal:
Em cabeçalhos de loop muito longos , acho que pode fazer sentido colocar
do
uma nova linha, como emou
O mesmo vale para o
then
em umaif
declaração.Mas, novamente, isso se resume às preferências de estilo pessoal ou a qualquer estilo de codificação que a equipe/projeto esteja usando.
Observe o que diz no topo da página:
PEP8 é o Guia de Estilo para Código Python. Embora o pessoal do Python geralmente pareça levar seus problemas de estilo muito a sério [citação necessária] , é apenas isso, um guia. Poderíamos apresentar vantagens tanto para colocar o
do
na mesma linha que ofor
, quanto para colocá-lo em uma linha própria.É a mesma discussão de onde colocar o
{
código C ao iniciar um bloco ou (ou algo parecido)if
.while
Algumas linhas abaixo na documentação, há outra regra interessante:
Presumo que o ponto aqui é que o autor desse guia de estilo pensa que usar a
function
palavra-chave é necessário para que o leitor reconheça uma declaração de função. No entanto,function foo
é uma forma não padronizada de definir uma função: a forma padrão éfoo()
. A única diferença entre os dois (no Bash) é que o outro é mais difícil de portar para um shell padrão, como/bin/sh
no Debian ou no Ubuntu.Então, eu sugeriria pegar todos e quaisquer guias de estilo com um grão de sal ou três e decidir por si mesmo qual é o melhor estilo. Um bom verificador de estilo permite desabilitar algumas verificações (bashate tem
bashate -i E010,E011
que ignorar essas duas verificações). Um excelente verificador de estilo permitiria que você modificasse os testes, por exemplo, para verificar o oposto de E020, aqui.TL;DR: Você não precisa. É só a opinião de um cara.
Como muitos outros, escrevo
for
loops como este há décadas:Esse layout destaca o fato de
do ... done
envolver o corpo do loop, como chaves em linguagens semelhantes a C, e permite que novas linhas separem os componentes da construção do loop.É claro que também existem guerras religiosas sobre onde colocar as chaves, então você pode dizer que o júri ainda não decidiu. IMHO, é claramente assim que isso foi projetado para funcionar; Bourne gostava de delimitadores combinados, cf.
if ... fi
,case ... esac
, e a necessidade de um ponto e vírgula na versão mais curta revela que você está tornando-a mais curta do que originalmente projetada. Nada de errado com isso; avanços tecnológicos e muitas coisas que antes pareciam uma boa ideia agora são desaprovadas, comogoto
. Mas até que toda a comunidade de scripts de shell adote as preferências dobashate
(s) autor(es), você não precisa fazer nada.Várias boas respostas aqui. Sempre tome guias de estilo com um pouco de sal, e IMHO e experiência, esteja sempre tão leve a moderadamente preocupado com qualquer comunidade que esteja repleta de dogmas excessivos quando se trata de estilo. É quase como se eles acreditassem que, quando FINALMENTE conseguirem o último ponto pontilhado e o último T cruzado, o software funcionará. Às vezes é preciso mais do que um estilo perfeito para remover bugs...
Quando comecei a aprender shell, a maioria dos scripts e tutes usavam o formato de ponto e vírgula in-line
mas como eu era inexperiente, tive um pouco de dificuldade em identificar o ; e fazer - ambos essenciais para confirmar a correção sintática. Então eu preferi o do na próxima linha sozinho. Eu não faço mais isso (trocadilho intencional)
Além disso, o comando 'while' é um excelente candidato para um pequeno truque:
mas quando os comandos prep são um pouco volumosos e/ou a condição é complexa, é melhor formatá-los como
e, em seguida, anexar o do como "; do" é positivamente fútil.
Você pode até ficar mais intenso do que isso:
porque cada declaração é uma expressão. Observe como ambos os estilos são usados de forma oportunista. Mantenha-o limpo e é bastante legível. Compacte ou contorça em nome do estilo ou "economize espaço" e torna-se uma bagunça horrível.
Então! Dado o estilo bastante barroco dos scripts de shell em geral, qualquer coisa destinada a aumentar a clareza e facilitar o acesso visual a símbolos significativos é sempre uma coisa boa.
A forma em que 'do' é escrito em linha com o comando é agradável quando você tem um pequeno comando - não acho o 'do' visualmente oculto, nem o comando interno é realmente obscurecido:
Acho isso bastante agradável de se ver e tem análogos com while, if e case:
Clareza e organização geral é tudo o que Codd* pede de você.
*Edgar F. Codd, pai da teoria de banco de dados relacional.
Estou surpreso que ninguém tenha mencionado essa sintaxe válida e portátil ainda:
Observe cuidadosamente que
for
edo
estão na mesma linha, sem ponto e vírgula. Resultado: