Muita gente não sabe, mas é possível programar no console do Linux (tela preta) utilizando as mesmas técnicas usadas dentro de um shell script. Muitas vezes você precisa automatizar algo rapidamente e não quer criar um script para isso e, é aí que esta técnica se torna muito eficiente e traz os mesmos resultados de um script.

Ao final deste artigo você saberá:

  • Conceitos básicos sobre programação shell no console do Linux;
  • Quando vale a pena criar um script;
  • Técnicas que salvam horas de trabalho manual;

Como eu disse no artigo anterior, codificar shell scripts no Linux se tornou uma das minhas grandes paixões Nerd. Isso aconteceu porque quando descobri o que eu poderia fazer utilizando shell script, entendi que poderia automatizar muita coisa no Linux e ser mais eficiente no meu trabalho.

Para codificar bem em shell script, primeiro é necessário conhecer bem como as coisas funcionam no console do Linux, pois é possível utilizar as mesmas técnicas dentro de scripts e não necessariamente você precisa criar um script.

Variáveis

Variável é um conceito que você precisa entender se quer programar em qualquer linguagem ou quer ser um administrador de sistemas. Variáveis são formas de armazenar conteúdos que podem ser consultados posteriormente enquanto aquela sessão estiver em andamento ou enquanto o sistema estiver ligado.
A criação ou declaração (nome mais bonito e mais utilizado em programação) de variáveis no console ou em scripts é exatamente a mesma, veja os exemplos abaixo.

# Criando uma variável qualquer com o valor 10:
$ VALOR=10

# Imprimindo o valor da variável:
$ echo $VALOR
10

Essa variável existirá até que o console esteja aberto e, também é possível apagá-la agora mesmo:

$ unset VALOR
$ echo $VALOR

$ VALOR=10
$ echo $VALOR
10

Você pode abrir o console do Linux agora mesmo e fazer os testes acima sem precisar criar um script.

Para ver todas as variáveis disponíveis no console, basta usar o comando “set”:

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
…
 VALOR=10
…

É possível criar valores dinâmicos para variáveis, como por exemplo guardar o resultado de um comando dentro de uma variável:

$ RESULTADO=$(ls -l /etc)
$ echo $RESULTADO
total 1372
drwxr-xr-x 3 root root 4096 Apr 2 14:53 acpi
-rw-r--r-- 1 root root 2981 May 18 2012 adduser.conf
drwxr-xr-x 2 root root 12288 Jun 13 10:46 alternatives
…

Ou ainda criar variáveis com o valor de outra variável:

$ VALOR=$RESULTADO
echo $VALOR
total 1372
drwxr-xr-x 3 root root 4096 Apr 2 14:53 acpi
-rw-r--r-- 1 root root 2981 May 18 2012 adduser.conf
drwxr-xr-x 2 root root 12288 Jun 13 10:46 alternatives
…

Fazendo loops e comparações

Pode-se dizer que você está efetivamente programando, quando começar a utilizar comparações e loops. Explicarei rapidamente abaixo como isso funciona e qual a forma de utilização.

# Comparar duas variáveis e tomar uma decisão baseado no retorno da comparação:
$ VALOR1=10
$ VALOR2=15
$ [ “$VALOR1” = “$VALOR2” ] && echo “São iguais.” || echo “São diferentes.”
São diferentes.

# Se mudar o valor da variável VALOR2 para 10 e rodar novamente o teste:
$ VALOR2=10
[ “$VALOR1” = “$VALOR2” ] && echo “São iguais.” || echo “São diferentes.”
São iguais.

A comparação acima faz o seguinte:

  • O conteúdo dentro de [..] é testado e, se for verdadeiro…
  • Executa o que está logo após os && e, se for falso…
  • Executa o que está logo após os ||

OBS: Cuidado ao copiar estes códigos e colar no console do Linux, pois as aspas duplas (“) podem ser substituídas por outra coisa.

Esta é uma forma simplificada da estrutura IF/ELSE que não é tão legal para ser utilizada no console e sim dentro de scripts, mas que também é possível:

$ if [ "$VALOR1" = "$VALOR2" ] ; then echo "São iguais."; else echo "São diferentes."; fi

Dentro de um script ficaria assim:

if [ "$VALOR1" = "$VALOR2" ] ; then 
 echo "São iguais."
else 
 echo "São diferentes."
fi

Quando eu falo sobre programar no console, talvez uma das coisas que eu mais utilizo seja o FOR.
O FOR permite criar estruturas de loop onde o sistema executará algo enquanto a condição for verdadeira ou falsa ou enquanto existir itens a serem processados. Com exemplos fica mais fácil de explicar. Veja abaixo:

$ for valor in 1 2 3 4 5 ; do echo $valor ; done 
1
2
3
4
5

A estrutura básica do FOR é:
for VARIAVEL in ITENS SEPARADOS POR ESPAÇO ; do COMANDO/O QUE FAZER ; done

Desta forma, a cada iteração, VARIAVEL assume o valor de cada item e executa COMANDO/O QUE FAZER.

É possível popular ITENS com arquivos ou qualquer outra coisa:

$ for valor in /etc/*.cfg ; do ls -l $valor ; done 
-rw-r--r-- 1 root root 373 Apr 30 2011 /etc/rearj.cfg
-rw-r--r-- 1 root root 51 Nov 29 2012 /etc/vdpau_wrapper.cfg

Existe outra forma de se utilizar o FOR para testar condições e criar loops condicionais, sua forma é:

for ((VARIAVEL=X; X < 5; X++)) ; do COMANDO/O QUE FAZER ; done

$ for ((valor=0; valor < 5; valor++)) ; do echo $valor ; done
0
1
2
3
4

A estrutura acima funciona assim:

  • valor=0 inicia a variável “valor” com o valor 0;
  • valor < 5 testa se a variável “valor” é menor que 5 a cada iteração e se for, executa COMANDO/O QUE FAZER;
  • valor++ incrementa matematicamente em 1 o conteúdo da variável “valor” a cada iteração.

Essa forma de se programar no console também é conhecida como “one-liner” onde você resolve um problema utilizando técnicas de programação em apenas uma linha.
Esse é um conteúdo bem básico sobre como iniciar a programar no console do Linux e como você dever ter percebido, se precisar fazer algo mais complexo ou mais logo, vale a pena criar um script.

Para finalizar, quero deixar aqui um exemplo bem útil de one-liner que utiliza os conceitos aprendidos acima para converter fotos para a resolução 1024×768:

$ mkdir newdir
$ for foto in *.jpg ; do convert $foto -resize 1024x768 newdir/$foto ; done

Gostaria muito de ouvir a sua opinião sobre este conteúdo para saber se o conteúdo deste blog está te ajudando de alguma forma. Logo abaixo você pode deixar o seu comentário.

No próximo artigo falarei um pouco mais sobre programação shell.

Até a próxima.

Comentários

comentários