Introdução ao Shell Script

Por Felipe Arruda

Nos últimos tutoriais, mostramos um pouco da flexibilidade e do poder do modo console do Linux. Com apenas algumas linhas de comando e certos conceitos em mente, pudemos realizar em poucos segundos tarefas que seriam repetitivas ou dispendiosas. Porém, isso pode ficar ainda melhor com o uso de shell scripts.

Um shell script permite encadear comandos para solucionar tarefas mais complexas, como automatizar backups, redimensionar um lote de fotografias, limpar erros de um arquivo de texto, etc. Mas eles não são apenas uma simples sequência de comandos e podem usar características comuns às linguagens de programação, como condições (if-then-else) e até loops (for, repeat).

Neste tutorial, vamos usar sintaxe, funções e comandos comuns ao bash, o shell padrão de muitas distribuições Linux, como é o caso do Ubuntu. Além disso, é preciso explicar que shell scripts são arquivos de texto puro e, portanto, vale a pena apredender a usar o Vim, o Nano ou qualquer outro software equivalente.

Como criar um shell script

Para criar um shell script é necessário obedecer a algumas regras. Para começar, a primeira linha do arquivo deve ser uma invocação do próprio bash:

#!/bin/bash

A partir disso, toda linha nova será um comando ou parte de uma rotina maior, como um loop. Caso você queira anotar algum comentário em meio ao código, inicie a linha com o caractere # (não use o ponto de exclamação logo em seguida, como na primeira linha do script).

Também se faz necessário habilitar a permissão de execução no arquivo do shell script, com o comando chmod a+x nomedoarquivo, por exemplo. Qualquer dúvida, recorra ao tutorial sobre permissões de arquivos publicado aqui mesmo, no Canaltech.

Depois disso, torna-se possível executar o seu script como se ele fosse só mais um comando do Linux. Basta acessar a pasta em que ele se encontra e, em seguida, lançar o script com o comando ./nomedoscript. Revisaremos esses passos em nossos exemplos.

Primeiro shell script

Existe uma tradição no mundo da informática. Quando alguém começa a aprender uma nova linguagem de programação, o primeiro exemplo criado é sempre um programa do tipo hello world, ou seja, capaz de exibir a frase "Hello, World!" ao ser executado. No Linux, o comando usado para apresentar uma mensagem na tela é o echo e, portanto, nosso primeiro script poderia ser escrito com os seguintes passos em um terminal:

1. Execute o comando vi helloworld.sh;

2. Pressione a tecla i e, em seguida, digite;

#!/bin/bash

echo "Hello, World!"

3. Pressione Esc e, depois, digite :wq. Pressione a tecla Enter para que o arquivo seja salvo e o Vim encerrado;

4. Atribua a permissão de execução ao script recém-criado, com o comando chmod a+x helloworld.sh;

5. Depois, basta executar o script: ./helloworld.sh

Se tudo correr bem, você verá a mensagem "Hello, World!" sempre exibida logo em seguida. Seu primeiro shell script está criado.

Hello World em shell script

Usando variáveis

Lembra dos tutoriais sobre variáveis de ambiente? Pois podemos criar variáveis aqui também. Um maneira de tornar esse script um pouco mais complexo seria armazenar a frase "Hello, World!" em uma variável chamada TEXTO. Por exemplo:

#!/bin/bash

TEXTO="Hello, World!"

echo $TEXTO

Execute o arquivo novamente e você perceberá que o mesmo resultado será obtido.

Um script mais complexo

Vamos criar um script que usa a saída de um comando como dado de entrada para outro comando. Ficou confuso? Explicamos. O script a seguir copia um arquivo e, durante a operação, acrescenta a data e a hora local ao nome do novo arquivo. Para isso, usaremos dois comandos: date e cp.

Com o comando date, obteremos os dados que serão acrescentados ao nome do arquivo e, com o comando cp, faremos a cópia em si, renomeando-o. Seguindo a lógica dos passos anteriores, nosso script poderia ser produzido com a seguinte sequência:

1. Execute o comando vi copiar.sh;

2. Pressione a tecla i e, em seguida, digite;

#!/bin/bash

DATA=`date +%y%m%d-%H%M`

cp $1 $DATA-$2

3. Pressione Esc e, em seguida, digite :wq. Pressione Enter para que o arquivo seja salvo e o Vim encerrado;

4. Atribua a permissão de execução ao script recém-criado, com o comando chmod a+x copiar.sh;

5. Depois, basta executar o script: ./copiar.sh arquivo-origem arquivo-destino

Você perceberá que o arquivo de destino será nomeado com algo parecido com 140529-1811-arquivo-destino. Essa é uma técnica bacana para que os arquivos fiquem naturalmente ordenados por data de criação, graças à nomenclatura que recebem.

Esse script fornece dois novos detalhes que ainda não foram apresentados. Primeiramente, as aspas do valor da variável foram substituídas por crases. Isso acontece porque o bash faz diferença entre aspas simples, aspas duplas e crases.

As aspas simples interpretam literalmente a frase que estiver entre elas e as variáveis não são processadas. Já as aspas duplas processam o conteúdo das variáveis. Se no exemplo do script helloworld.sh tivéssemos usado a linha echo '$TEXTO', por exemplo, o resultado impresso na tela seria $TEXTO, e não Hello, World!, como acontece com a as aspas duplas.

A crase faz com que o comando que estiver entre elas seja executado e seu resultado armazenado em variáveis ou usado por outro comando.

Além disso, há o uso de duas variáveis especiais e que não precisaram ser declaradas no código: $1 e $2. Essas variáveis representam o primeiro e o segundo parâmetro passado na linha de comando usada para executar o script. No caso desse exemplo, $1 equivale a arquivo-origem e $2 a arquivo-destino.

Exemplo de loop e condição

Para finalizar, vamos apresentar um exemplo um pouco mais complexo de shell script, que conta com um fator condicional. Veja o script a seguir:

#!/bin/bash

COUNT=0

for i in `ls`

do

COUNT=$((COUNT+1))

done

echo "Foram encontrados $COUNT arquivos"

O trecho for i in `ls` diz que para cada item encontrado com o comando ls, a variável COUNT deve ser incrementada. Quando essa condição deixa de ser satisfeita, ou seja, quando acabam os arquivos listados pelo ls, o loop termina (done) e, então, o echo anuncia quantos arquivos foram encontrados, imprimindo o valor de $COUNT na tela.

Além desse tipo de rotina, você também pode acrescentar uma condição para a mensagem a ser exibida. Digamos que em vez da última linha tivéssemos o seguinte código:

if [ "$COUNT" -eq 0 ]; then

echo "Nenhum arquivo encontrado"

elif [ "$COUNT" -eq 1 ]; then

echo "Apenas 1 arquivo foi encontrado"

else

echo "Foram encontrados $COUNT arquivos"

fi

Esse bloco faz com que a mensagem mude de acordo com o número de arquivos encontrados. A tradução para o código poderia ser a seguinte: se (if) $COUNT for igual (-eq) a zero, então (then) imprima a mensagem "Nenhum arquivo encontrado" na tela. Ou se (elif) $COUNT for igual a um, então (then) exiba "Apenas 1 arquivo encontrado". Senão (else), mostre "Foram encontrados x arquivos", onde x é o valor armazenado na variável $COUNT. Por último, termine o bloco dessas condições (fi).

Porém, esse script tem um bug. Ele nunca poderá ser executado em um diretório vazio, pois o arquivo deste script precisa estar dentro do diretório em que ele está sendo executado. No mínimo, a variável $COUNT terá o valor 1. Para corrigir, basta alteramos o nosso for, incluindo a variável $1 no comando ls. Portanto, o script completo ficaria:

#!/bin/bash

COUNT=0

for i in `ls $1`

do

COUNT=$((COUNT+1))

done

if [ "$COUNT" -eq 0 ]; then

echo "Nenhum arquivo encontrado"

elif [ "$COUNT" -eq 1 ]; then

echo "Apenas 1 arquivo foi encontrado"

else

echo "Foram encontrados $COUNT arquivos"

fi

Agora você pode passar um diretório (vazio ou não) como parâmetro para ele. Exemplo: ./for.sh diretorio/. A saída será semelhante à captura de tela abaixo:

Exemplo shell script

Como você pode perceber, esses foram exemplos com objetivos meramente didáticos. Porém, a partir deles você pode descobrir como combinar esses e outros recursos do shell e criar os seus próprios scripts. A programação em shell script é um assunto muito amplo e você pode encontrar cursos e livros inteiros dedicados a ela. Entretanto, esperamos que este tutorial sirva como um primeiro passo à descoberta do conhecimento.

Este artigo faz parte de nossa biblioteca de conteúdo "Tudo o que você precisa saber sobre o Linux". Não deixe de acessar e conferir todo o conteúdo publicado sobre o Pinguim.

Fonte: http://www.howtogeek.com/67469/the-beginners-guide-to-shell-scripting-the-basics/