Noções básicas de automação e script do Bash (parte 2)

Shutterstock / Mopic
O Bash é um shell e linguagem de codificação ideal, permitindo que você crie scripts de automação de ponta. Nesta segunda parte da série, veremos a densidade de codificação, comentários embutidos e aspas variáveis corretas usando aspas simples ou duplas.
Noções básicas de automação e script do Bash
Se você ainda não fez isso e está apenas começando no Bash, leia nosso artigo Bash Automation and Scripting Basics Part 1. Este é o segundo artigo de nossa série de três partes sobre automação Bash e noções básicas de script. No artigo de hoje, examinaremos, entre outros tópicos, a densidade de codificação do Bash e sua conexão com a preferência do desenvolvedor. Também veremos comentários in-line relacionados a isso.
Quando começamos a criar pequenos scripts, explorando variáveis e trabalhando com strings de texto, percebemos rapidamente que pode haver uma diferença conceitual entre aspas simples e duplas. Sim, e no segundo tópico abaixo, nós iremos nos aprofundar nisso.
Densidade e concisão da codificação Bash
A linguagem de codificação do Bash pode ser muito densa e concisa, mas também pode ser espaçosa e detalhada. Depende em boa medida da preferência do desenvolvedor.
Por exemplo, o seguinte código Bash:
verdadeiro || echo 'falso'
Que pode ser lido como Não fazer nada e fazê-lo com sucesso (código de saída 0) e, se falhar (você pode ler o idioma Bash || como OU), a saída é o texto & # 8216; falso ’, também pode ser escrito como:
se [! verdade ]; então echo 'falso' fi
O que torna o código um pouco diferente, mas basicamente faz o mesmo.
Isso, por sua vez, pode ser lido como Se verdadeiro não for (indicado pelo! idioma) verdadeiro, produza o texto & # 8216; falso ’.

Ambos os mini-scripts resultam na mesma saída vazia, pois verdadeiro não é falso.
A infinidade de comandos e ferramentas disponíveis (ou instaláveis) na linha de comando ampliam ainda mais o possível deslocamento entre scripts altamente legíveis e códigos densos e concisos de difícil compreensão.
Considerando que os exemplos acima são curtos e relativamente fáceis de entender, quando você cria uma linha longa (um termo frequentemente usado entre os desenvolvedores Bash para indicar um trecho de código, consistindo em vários comandos, escritos em uma única linha) empregando muitos de tais comandos, em vez de colocá-los em um script mais detalhado, a diferença se torna mais clara. Considere:
V = "$ (sleep 2 & fg; echo -n '1' | sed 's | [0-9] | a |')" & amp ; & echo "$" | sed 's | [a-z] | 2 | g' || echo 'falha'

Este é um script Bash de uma linha típico que usa os comandos sleep, fg, echo e sed, bem como vários idiomas Bash e expressões regulares para basicamente dormir 2 segundos, produzir algum texto e transformar esse texto usando expressões regulares . O script também verifica regularmente as condições / resultados de comandos anteriores usando os idiomas do Bash || (se não obtiver sucesso, faça o seguinte) e & & (se for bem-sucedido, faça o seguinte)
Eu traduzi isso, com funcionalidade de correspondência aproximada, para um script mais completo, com algumas modificações. Por exemplo, trocamos nosso fg (traz o comando sleep colocado em segundo plano de volta para o primeiro plano e esperamos que ele termine como processos normais fora de segundo plano) para esperar o que irá esperar pelo PID do sono (iniciado por eval e capturado por usando o idioma Bash $!) para encerrar.
#! / bin / bash CMD = "dormir 2" eval $ & espere $! EXIT_CODE = $ {?} V = "$ (echo -e" $ \ n1 "| sed 's | [0-9] | a |')" if [$ -eq 0]; em seguida, echo "$" | sed 's | [a-z] | 2 | g' EXIT_CODE = $ {?} if [$ -ne 0]; então echo 'fail' fi fi

Que diferença! E este é apenas um desenvolvedor escrevendo à sua maneira. O código Bash escrito por outros tende a ser um tanto desafiador de ler, e essa dificuldade aumenta rapidamente com a densidade e concisão. Ainda assim, um desenvolvedor de nível especialista em Bash entenderá rapidamente até mesmo códigos altamente densos e concisos escritos por outros, com algumas exceções, por exemplo, expressões regulares.
Para saber mais sobre como escrever expressões regulares, dê uma olhada em Como modificar texto usando expressões regulares com o editor de fluxo sed.
A partir desses exemplos, fica claro que sua milhagem varia com o tempo. Em geral, no entanto, a facilidade de uso do codificador (escrevendo código altamente legível) é recomendada sempre que você começar a desenvolver scripts Bash.
Se você tiver que criar um código denso e conciso, poderá fornecer muitos comentários embutidos. Uma linha com o prefixo # é considerada uma linha de comentário / observação, e o símbolo # pode até ser usado no final de uma linha após qualquer comando executável, para postar um comentário de sufixo explicando o comando, declaração condicional, etc. Por exemplo:
# Este código irá dormir um segundo, dormir duas vezes 1 # Primeiro sono dormir 1 # Segundo sono
Citações simples ou citações duplas?
No Bash, o texto entre aspas simples (') é tomado como texto literal pelo interpretador Bash, enquanto o texto entre aspas duplas (") é interpretado (analisado) pelo interpretador Bash . Considerando que a diferença em como as coisas funcionam pode não ser imediatamente clara a partir desta definição, o exemplo a seguir nos mostra o que acontece quando trocamos 'por "e vice-versa:
echo '$ (echo "Hello world")' echo "$ (echo 'Hello world')"

No primeiro exemplo, o texto $ (echo "Hello world") é visto como texto literal e, portanto, a saída é simplesmente $ (echo "Hello world"). No entanto, para o segundo exemplo, a saída é Hello world.
O interpretador Bash analisou o texto entre aspas duplas para ver se encontraria algum idioma especial do Bash para agir. Um desses idiomas foi encontrado em $ (...) que basicamente inicia um subshell e executa tudo o que está presente entre os idiomas (...). Pense nisso como um shell dentro de um shell – um subshell – executando tudo o que você passar para ele como um comando totalmente novo. A saída de qualquer comando ou comandos é então passada de volta ao shell de nível superior e inserida no local exato onde o subshell foi iniciado.
Assim, nosso subshell executou o eco 'Hello world', cuja saída é Hello world. Uma vez feito isso, o subshell foi encerrado e o texto Hello world foi inserido em vez da invocação do subshell $ (...) (pense nisso como se todo o código $ (...) estivesse sendo substituído por qualquer saída do subshell gerado.
O resultado, para o shell superior, é o seguinte comando: echo "Hello world", cuja saída é Hello world, como vimos.
Observe que alteramos as aspas duplas dentro do subshell para aspas simples. Isso não é necessário! Seria de se esperar um erro de análise quando um comando assumisse a sintaxe de echo "..." ... "...", em que as segundas aspas duplas encerrariam a primeira, seguida por mais teste e, portanto, levando a um erro. No entanto, este não é o caso.
E isso não é porque o Bash é flexível com strings multi-aspas (ele aceita echo 'test' "More test" 'test' felizmente, por exemplo), mas porque o subshell é um shell por si só, e portanto duplo as aspas podem ser usadas, novamente, dentro do subshell. Vamos provar isso com um exemplo adicional:
echo "$ (echo" $ (echo "mais aspas duplas") ")"

Isso funcionará bem e produzirá mais aspas duplas. Os dois subshells aninhados (executando dentro do shell principal a partir do qual você está executando isso), cada um por sua vez, aceita aspas duplas e nenhum erro é gerado, mesmo se várias aspas duplas estiverem aninhadas no comando geral de uma linha. Isso mostra um pouco do poder de programação do Bash.
Em resumo
Tendo explorado a densidade de codificação, percebemos o valor de escrever um código altamente legível. Se tivermos que criar um código denso e conciso, podemos adicionar muitos comentários embutidos usando # para ajudar na legibilidade. Vimos as aspas simples e duplas e como sua funcionalidade difere substancialmente. Também vimos rapidamente os comentários embutidos nos scripts, bem como a funcionalidade do subshell quando executado a partir de uma string entre aspas duplas. Finalmente, vimos como um subshell pode usar outro conjunto de aspas duplas sem afetar, de forma alguma, as aspas duplas usadas em um nível superior. Fique ligado na parte 3!
Nenhum comentário