1. Resumo
Não entendo, por que preciso da regra de bashate E010 .
2. Detalhes
Eu uso o bashate para linting de .sh
arquivos. Regra E010:
fazer não na mesma linha para
for
bashate:
Corrigir:
#!/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 eu 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 de base . Eu acho apenas :
Um conjunto de regras que ajudam a manter as coisas consistentes nos blocos de controle. Eles são ignorados em longas filas que têm uma continuação, porque desenrolar isso é meio "interessante"
bash
shell-script
Саша Черных
fonte
fonte
do
é definitivamente um pouco incomum, masfor ... \ndo\n<indent>body...
é extremamente comum e eu ainda estimaria mais do que issofor ... ; do
. Ele também reclama disso?bashate
é um verificador de estilo . Os estilos são inerentemente subjetivos. Não use se você não gosta do estilo de biblioteca de arte que ele impõe. Em vez disso, você deve considerar um verificador de sintaxe / erros como o shellcheck .E010
- única estilo regra ou , em alguns casos que eu preciso para e fazer na mesma linha, não só por razões de estilo.do
. É como recuar a chave de abertura de umif
e adicionar código nessa mesma linha em uma linguagem como C. Outro exemplo, se o python permitir, seria colocar:
um de umif
recuo na próxima linha e adicionar código nessa mesma linha. Vai fazer a diferença com linhas adicionais no corpo.Respostas:
Sintaticamente, os dois trechos de código a seguir estão corretos e equivalentes:
Esta última pode-se possivelmente ser considerado mais difícil de ler como
do
obfuscates ligeiramente o comando no corpo do ciclo. Se o loop contiver vários comandos e o próximo comando estiver em uma nova linha, a ofuscação será destacada ainda mais:... mas sinalizá-lo como um "erro" é IMHO a opinião pessoal de alguém, e não uma verdade objetiva.
Em geral, quase todos
;
podem ser substituídos 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
A razão para usar um sobre o outro é a legibilidade e convenções de estilo local / pessoal.
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 pessoais de estilo ou a qualquer estilo de codificação que a equipe / projeto esteja usando.
fonte
do
, não vejo uma razão pela qual colocá-lo na próxima linha ajude a legibilidade.do
(outhen
) em uma linha por conta própria (como no segundo para o último exemplo). Tudo isso tem a ver com preferências pessoais. Não gosto de linhas muito longas, em parte porque meu terminal tem "apenas" 80 caracteres de largura e em parte porque acho que parece desarrumado. Também acho difícil analisar linhas muito longas quanto a erros.do
em uma linha separada um "erro". Aqueles são bastante frases rigorosos, por isso não parece valer a pena salientar que, muito pelo contrário, a chamada "regra" é na verdade apenas uma opinião subjectiva.Observe o que diz na parte superior da página:
O PEP8 é o Guia de Estilo para Código Python. Embora o pessoal do Python pareça levar seus problemas de estilo muito a sério [citação necessário] , é apenas isso, um guia. Poderíamos criar vantagens tanto para colocar o
do
mesmo na linha quantofor
para colocar na linha própria.É a mesma discussão de onde colocar o
{
código C ao iniciar umif
ouwhile
bloco (ou algo assim).Algumas linhas abaixo na documentação, há outra regra interessante:
Suponho que o argumento aqui é que o autor desse guia de estilo pensa que o uso da
function
palavra-chave é necessário para o leitor reconhecer uma declaração de função. No entanto,function foo
é uma maneira não padrão de definir uma função: a maneira 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 Ubuntu.Então, eu sugiro que você tome todos e quaisquer guias de estilo com um grão de sal ou três e decida por si mesmo qual é o melhor estilo. Um bom verificador de estilo permite desativar algumas verificações (o bashate deve
bashate -i E010,E011
ignorar essas duas verificações.) Um excelente verificador de estilo permitiria modificar os testes, por exemplo, verificar o oposto de E020 aqui.fonte
TL; DR: Você não precisa. É apenas a opinião de um cara.
Como muitos outros, eu tenho escrito
for
loops há décadas:Esse layout destaca o fato de
do ... done
envolver o corpo do loop, como chaves em linguagens do tipo C, e permite que as novas linhas separem os componentes da construção do loop.É claro que existem guerras religiosas sobre onde colocar os aparelhos também, então você pode dizer que o júri ainda está envolvido. IMHO, é claramente como isso foi projetado para funcionar; Bourne gostava de delimitadores correspondentes, cf.
if ... fi
,,case ... esac
e a necessidade de ponto e vírgula na versão mais curta revela que você está diminuindo o tamanho do que foi originalmente projetado. Nada de errado com isso; avanços tecnológicos e muitas coisas que antes pareciam uma boa idéia agora são desaprovadasgoto
. Mas até que toda a comunidade de scripts de shell adote as preferências dobashate
(s) autor (es), você não precisa fazer nada.fonte
fi
que corresponde aif
, eesac
etc., vem do Algol 68. A única razão pela qual umfor
loopdo
não terminaod
é queod
é o nome de um utilitário padrão existente. Veja en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unixbegin ... end
etc.).od
, isso é engraçado ... (Embora, por que não simplesmente acabar para-loops comrof
, então?)BEGIN
eEND
são definidos lá também.FOR
eDO
também estaria em linhas separadas, por convenção, exceto quando o loop inteiro caberia facilmente em uma única linha.Estou surpreso que ninguém tenha mencionado essa sintaxe válida e portátil ainda:
Observe com cuidado que
for
edo
estão na mesma linha, sem ponto e vírgula. Resultado:fonte
for q
edo
estão em linhas separadas (a forma neste exemplo foi sem suporte um par de décadas atrás na casca Almquish original (ash
): in-ulm.de/~mascheck/various/ bourne_args / # endnote )Várias boas respostas aqui. Sempre leve guias de estilo com um pouco de sal, e IMHO e experiência, preocupe-se levemente a moderadamente com qualquer comunidade que esteja repleta de dogmas excessivos quando se trata de estilo. É quase como se eles acreditassem que, quando FINALMENTE chegarem ao último ponto que eu pontuei e esse último T cruzado, o software funcionará. Às vezes, é preciso um estilo mais que perfeito para remover os bugs ...
Quando comecei a aprender shell, a maioria dos scripts e tutes por aí usavam o formato de ponto-e-vírgula em linha
mas como eu era inexperiente, tive dificuldade em encontrar o; e faça - ambos essenciais para confirmar a correção sintática. Então, eu preferi o fazer na próxima linha por si só. Eu não faço mais isso (trocadilhos)
Além disso, o comando 'while' é um excelente candidato a um pequeno truque:
mas quando os comandos de preparação são um pouco volumosos e / ou a condição é complexa, é melhor formatado como
e, em seguida, anexar o do como "; do" é positivamente incorreto.
Você pode até ficar mais intenso que isso:
porque toda afirmação é uma expressão. Observe como os dois estilos são usados oportunisticamente. Mantenha-o limpo e é bastante legível. Compactar ou contorcê-lo em nome do estilo ou "economizar espaço" e torna-se uma bagunça horrível.
Tão! Dado o estilo bastante barroco dos scripts de shell em geral, qualquer coisa que vise aumentar a clareza e o fácil acesso visual a símbolos significativos é sempre uma coisa boa.
A forma em que 'do' é escrita de acordo com o comando é agradável quando você tem um pequeno comando - não acho o 'do' visualmente oculto, nem o comando interno é realmente obscuro:
Acho isso bastante agradável de se ver, e tem análogos com while, if e case:
Clareza e arrumação geral é tudo o que o Codd * pede de você.
* Edgar F. Codd, pai da teoria do banco de dados relacional.
fonte
while
com umaif
condição antes. Legal!