terça-feira, 21 de fevereiro de 2012

Como escrever shell scripts (parte 1)

A linguagem de programação shell script é, talvez, o primeiro contato do usuário de Linux com o mundo do desenvolvimento de aplicativos. Ela é tão poderosa que serve tanto para automatizar tarefas simples, como o backup semanal dos arquivos em um servidor, até para criar avançadas interfaces gráficas e pequenos programas de gerenciamento, como aqueles utilizados pelo BigLinux e outras distribuições nacionais.


É claro que já existem inúmeros tutoriais e sites pela rede explicando como criar seus scripts, como a página do Aurério Jargas, mas esse tutorial pretende diferenciar-se ao trazer uma linguagem simples, dirigida por exemplos práticos, dando uma leve noção dessa tecnologia ao leitor que, se tiver interesse, poderá, ulteriormente, aprofundar-se no assunto consultando fontes mais técnicas.



A grossíssimo modo, podemos dizer que um arquivo shell script é o equivalente a um arquivo de lotes do MS-DOS ou do Windows: a semelhança entre eles reside no fato de que ambos são, em última análise, um conjunto de comandos do interpretador escritos em sequência que são interpretados pelo mesmo. A comparação termina aí, pois a linguagem shell script é muito mais poderosa e robusta do que aquela do MS-DOS graças, principalmente, às poderosas ferramentas de linha de comando do Linux. Com o tempo, você perceberá que muitos comandos que parecem inúteis ou bobos quando executados diretamente da linha de comandos, como cut, revelarão-se extremamente úteis e poderosos se combinados com outros em um script.


Tudo que você precisa para começar a escrever seu primeiro shell script é de um processador de textos planos, como o Vim, mas você também pode usar o GEdit ou o Kate caso não se sinta à vontade para utilizar a primeira sugestão. Jamais utilize um processador como o Writer do LibreOffice, pois a formatação do texto tornará seu script inútil.


A primeira coisa a fazer em um arquivo shell script é especificar qual será o interpretador de comandos que vai executar aquele script através da linha Shebang:


#!/bin/bash


O Shebang é o conjunto de caracteres #! seguido do caminho absoluto do interpretador que será utilizado para executar os comandos daquele arquivo. Nesse exemplo, nós estamos dizendo que vamos usar o Bourne-Again Shell - e esse é o mais utilizado para fazer scripts atualmente pelo fato de ser o padrão na maior parte das distros disponíveis. No entanto, você pode especificar o interpretador que quiser, como sh, ksh, csh, desde que ele esteja instalado em sua máquina ou na máquina que vai rodar seu script. A linha Shebang deve ser, necessariamente, a primeira linha de seu script.


Após especificar qual interpretador será usado, você já pode começar a escrever seus comandos. E que comandos são esses? Ora, todos os comandos que você usaria normalmente, como echo, ls, chdir. Você pode, inclusive, incluir comandos que iniciem softwares gráficos, como o Firefox - mas neste caso seu script só funcionará se executado de dentro de uma seção do xorg.


Como é de praxe, vamos criar um script que imprime o tradicional "Alô, mundo!" na tela. Para isso, modifique seu script para que ele fique desse jeito:


#!/bin/bash


echo "Alô, mundo!"


A seguir, salve-o com o nome de exemplo1.sh. Seu script não precisa ter, necessariamente, a extensão .sh, mas é uma boa prática para mantê-lo organizado.


O próximo passo é dizer ao sistema que o arquivo que você criou é um programa executável. A maneira mais fácil é abrir a pasta onde você o salvou no terminal e digitar:


chmod +x exemplo1.sh


Com isso, você já pode executá-lo digitando ./exemplo1.sh na linha de comando. O uso de ./ se faz necessário pois estamos nos referindo a um programa que está no diretório local. O resultado será esse:


andre@linux-pc:~/Desktop$ ./exemplo1.sh
Alô, mundo!



Brincando com variáveis


Mas apenas escrever texto é algo muito chato. É para isso que existem as variáveis. De acordo com a Wikipedia, uma variável é uma entidade geralmente localizada na memória capaz de reter ou de representar o valor de uma expressão. Podemos pensar em variáveis como caixas onde você pode armazenar valores.


No shell Bash, declaramos uma variável da seguinte forma:


nome=valor


Perceba que não há espaços entre o nome da variável e o sinal de igual e esse sinal e seu valor. O erro mais comum de programadores tanto iniciantes quanto profissionais é escrever algo do tipo nome = valor, o que gera uma mensagem de erro. Além disso, para utilizarmos o valor armazenado nessa variável dentro de nosso programa, a indicamos precedida com o símbolo $. Resumindo: você escreve apenas o nome da variável quando vai declará-la e escreve o nome da variável precedido de um $ quando vai usar seu valor. A listagem abaixo, que corresponde ao arquivo exemplo2.sh, elucidará tal conceito:


#!/bin/bash


nome="André"


echo "Olá, $nome !"


O resultado da execução desse script será:


andre@linux-pc:~/Desktop$ ./exemplo2.sh


Olá, André !



Diferenças entre ", ' e `


Perceba que, no exemplo 2, utilizamos aspas duplas para envolver tanto o valor da variável quanto a expressão exibida pelo comando echo. Há uma importante diferença entre as aspas duplas ("), os apostofres ou aspas simples (') e o sinal de crase (`) que precisa ser bem compreendida imediatamente.


Enquanto as aspas duplas interpretam o valor de quaisquer variáveis que estejam em seu interior, as aspas simples exibem a expressão de forma literal. Assim, criamos o arquivo exemplo3.sh, com base no arquivo anterior, com dois comandos echo: o primeiro com aspas duplas e o segundo com aspas simples:


#!/bin/bash


nome="André"


echo "Olá, $nome !"


echo 'Olá, $nome !'


Aparentemente, as duas linhas são iguais, mas ao executar o arquivo, percebemos a diferença:


andre@linux-pc:~/Desktop$ ./exemplo3.sh


Olá, André !


Olá, $nome !


Enquanto a primeira linha, que tem aspas duplas, exibiu o valor armazenado na variável nome, neste caso André, a segunda linha, que tem aspas simples, exibiu o nome da variável em si! Assim, sempre que precisar de imprimir na tela uma linha que contenha o valor de uma variável, utilize aspas duplas para tal.


Essas aspas duplas e simples também possuem o mesmo efeito se utilizados na declaração de uma variável. Mas e se você precisar de escrever o caractere " ou o caractere ' na saída do comando echo? Para isso, basta precedê-lo com uma contrabarra. Por exemplo: o resultado do comando


echo ""Linux""


seria


"Linux"


Tão importante quanto a aspas duplas e simples é o sinal de crase. Ao contrário das duas, essa expressão substitui a declaração de um comando qualquer pelo seu resultado. O arquivo exemplo4.sh adapta o exemplo 2 para imprimir o nome do usuário logado no momento através do comando whoami:

#!/bin/bash


nome=`whoami`


echo "Olá, $nome !"


A saída desse script é:


andre@linux-pc:~/Desktop$ ./exemplo4.sh


Olá, andre !


Através da `, podemos avaliar e manipular a saída de vários comandos. Podemos, por exemplo, obter o conteúdo ou parte do conteúdo de determinado arquivo através do comando cat ou a lista dos arquivos de determinada pasta ou com determinada extensão através do comando ls ou, ainda, verificar se o usuário atual é o root e, com base nessa avaliação, permitir ou não a execução do script.


Além da crase, há outra forma de se obter o resultado de um comando: através da combinação $(). Essa alternativa deixa o código mais elegante e é particularmente útil quando estamos interessados em armazenar a saída de um comando que já utiliza a crase. Assim, poderíamos obter o mesmo resultado do script anterior se declarássemos a variável nome como nome=$(whoami).



Parâmetros de linha de comando


Existe, ainda, outro tipo de variável especial que são os parâmetros de linha de comando do nosso script. São as variáveis de $1 a $9 que nos permitem recuperar os valores que passamos para nosso programa no momento da execução. Eles podem ser extremamente úteis quando estamos escrevendo programas mais complexos. O exemplo 5, abaixo, mostra como escrever o primeiro parâmetro passado para o programa:


#!/bin/bash


echo "Você digitou $1 ."


Se você executá-lo com parâmetros diferentes, você terá saídas como essas:


andre@linux-pc:~/Desktop$ ./exemplo5 laranja


Você digitou laranja .


andre@linux-pc:~/Desktop$ ./exemplo5 pinguim


Você digitou pinguim .



Variáveis de ambiente, locais e globais


Há, ainda, as variáveis de ambiente, que são escritas em letra maiúscula e armazenam algumas informações do sistema ou do interpretador, como por exemplo a variável $HOME que armazena o caminho do diretório pessoal do usuário atual.


Uma última informação importante sobre as variáveis é que as mesmas podem ser de dois tipos: locais e globais. As variáveis locais são acessíveis apenas no shell atual e as globais são acessiveis no shell e nos processos nele iniciados.


Isso significa que, se você definir uma variável qualquer, do jeito que foi explicado aqui, na linha de comando do Bash e, após isso, iniciar seu script, ele não vai conseguir enxergar a variável que você definiu antes de chamá-lo. Para contornar essa limitação de segurança, devemos exportar a variável através do comando export. Tal comando pode ser utilizado tanto após da variável ter sido criada quanto no momento de sua criação. Os dois exemplos a seguir são válidos:


$ sistema="Linux"


$ export sistema


ou


$ export sistema="Linux"


Agora, você percebe que as possibilidades oferecidas pela linguagem shell script são praticamente ilimitadas mas, infelizmente, esse tutorial está chegando ao fim. Na próxima semana, vamos conhecer um pouco mais desse poder ao descobrir como podemos "encaixar" os processos uns nos outros através de comandos sequenciais e redirecionadores. Até lá!

3 comentários:

  1. Oi André.
    Dá uma olhada no meu site e vê se você aprova que teu artigo fique lá.
    http://j011yr0g3r.weebly.com/shell.html
    Se quiser agente pode montar uma parceiria. Ainda estou no piloto, então não se assuste se estiver meio amador.
    Parabéns pelo artigo, esclaresceu muito pra mim. Vai me dar uma semana de diversão na shell!
    Abraćo!

    ResponderExcluir
  2. Olá, Alexandre!

    É claro que eu aprovo, afinal, a maioria dos nossos artigos está sob a licença FDL, que permite sua republicação em outros veículos. O conhecimento deve de ser compartilhado ;)

    Apenas peço-lhe que, além do meu nome, coloque um link para a página original do artigo. Além disso, lembre-se que haverá mais artigos dessa série, então, fique ligado!

    Quanto a parcerias, utilize nosso formulário de contato ou fale diretamente com o @cleitonflima.

    Obrigado por nos visitar! Boa sorte com o Shell Script!

    ResponderExcluir
  3. a shell é pra ganhar carro é

    ResponderExcluir