Você nunca teve uma tarefa que precisava realizar repetidamente e que exigia muito trabalho de digitação na linha de comando? Nunca pensou: “Será que eu não poderia escrever apenas um comando para fazer tudo isso?” Talvez um script de shell seja o que você está procurando.

Scripts de shell são os equivalentes a arquivos em lote do MS-DOS e podem conter longas listas de comandos, controle de fluxo complexo, avaliações aritméticas,  variáveis e funções definidas pelo usuárioe testes de condição sofisticados. Scripts de shell são capazes de lidar com tudo, desde uma simples linha de comando até algo tão complexo quanto inicializar seu sistema Linux.

De fato, como você lerá neste post, os sistemas Linux fazem exatamente isso. Eles usam scripts para verificar e montar todos os sistemas de arquivo, configurar seus consoles, configurar a rede, carregar todos os serviços do sistema e, por fim, fornecer uma tela de login. Embora dezenas de shells diferentes estejam disponíveis no Linux, o shell padrão é chamado bash, o Bourne Again Shell.

Uma das principais vantagens dos scripts de shell é que eles podem ser abertos em qualquer editor de texto para ver o que fazem. Mas a grande desvantagem é que os scripts de shell grandes ou complexos costumam executar mais lentamente do que os programas compilados. Há duas maneiras básicas de executar um script de shell:
O nome do arquivo é usado como um argumento para o shell (como em bash  script).

Nesse método, o arquivo não precisa ser executável; ele apenas contém uma lista de comandos de shell. O shell especificado na linha de comando é utilizado para  interpretar os comandos no arquivo de script. Isso é mais comum para tarefas  simples e rápidas.

O script de shell também pode ter o nome do interpretador colocado na primeira linha do script precedido por #! (como em #!/bin/bash) e ter o bit de execução do arquivo contendo o script configurado (usando chmod +x nome_do_arquivo). Você pode então executar o script como qualquer outro programa em seu caminho simplesmente digitando o nome do script na linha de comando.

Quando os scripts são executados de qualquer uma dessas duas maneiras, as opções para o programa podem ser especificadas na linha de comando. Qualquer coisa  seguinte ao nome do script é referida como um argumento de linha de comando.

Como ocorre ao escrever qualquer software, não há substituto para um projeto claro e bem planejado e muitos comentários. O sinal de jogo da velha (#) precede os comentários e pode ocupar até uma linha inteira ou residir na mesma linha após o código de script. É melhor implementar scripts de shell mais complexos em etapas, certificando-se de que a lógica é correta em cada passo antes de continuar. Eis algumas boas dicas concisas para garantir que as coisas funcionem como esperado durante os testes:

Em alguns casos, você pode acrescentar um comando echo no início das linhas dentro do corpo de um loop e colocá-lo entre aspas. Desta maneira, em vez de executar o código, você pode ver o que será executado sem fazer quaisquer alterações permanentes.

Para alcançar o mesmo objetivo, você pode colocar comandos echo de teste por todo o código.

Se essas linhas forem impressas, você sabe que o desvio lógico correto está sendo conduzido.

Você pode usar set -x próximo do início do script para exibir cada comando que é executado ou carregar seus scripts usando:

$ bash –x meuscript

Como os scripts úteis têm uma tendência a crescer ao longo do tempo, manter seu código legível à medida em que progride é extremamente importante. Faça o  máximo que puder para manter a lógica de seu código limpa e fácil de seguir.

Entendendo variáveis de shell

Muitas vezes, dentro de um script de shell, você quer reutilizar determinados itens de informação.

Durante o curso de processamento do script de shell, o nome ou número representando essa informação pode mudar. Para armazenar as informações  utilizadas por um script de shell, de tal maneira que ele possa ser reutilizado  facilmente, você pode configurar variáveis. Os nomes de variáveis dentro de scripts
de shell diferenciam maiúsculas e minúsculas e podem ser definidos da seguinte maneira:

NAME=value

A primeira parte de uma variável é o nome de variável e a segunda parte é o conjunto de valores para esse nome. Certifique-se de que NAME e value estejam grudados ao sinal de igual, sem espaços.

Variáveis podem ser atribuídas a partir de constantes, como texto, números e sublinhados. Isso é útil para inicializar valores ou poupar trabalho de digitação para constantes longas. Os exemplos a seguir mostram variáveis definidas em uma string de caracteres (CIDADE) e um valor numérico (PI):

CIDADE=”Francisco morato”
PI=3.14159265

As variáveis podem conter a saída de um comando ou uma sequência de comandos. Você pode fazer isso precedendo o comando com um sinal de cifrão e parêntese de abertura e seguindo-o com um parêntese de fechamento. Por exemplo, MINHADATA=$(date) atribui a saída do comando date à variável MINHADATA.

Colocar o comando entre crases (`) pode ter o mesmo efeito. Nesse caso, o comando date é executado quando a variável é configurada e não cada vez que a variável é lida.

Usar variáveis é uma ótima maneira de obter informações que podem mudar de um computador para outro ou de um dia para outro. O exemplo a seguir configura a saída do comando uname -n para a variável MACHINE. Então, uso parênteses para configurar NUM_FILES como o número de arquivos no diretório atual  redirecionando (|) a saída do comando ls para o comando de contagem de palavras (wc -l).

MAQUINA=’uname –n’
NUM_ARQUIVO=$(/bin/ls | wc –l)

As variáveis também podem conter o valor de outras variáveis. Isso é útil quando você tem de preservar um valor que mudará a fim de poder usá-lo mais tarde no script. Aqui, BALANCE é configurado para o valor da variável CurBalance:

BALANCE=”$CurBalance”

Anúncios