Shell Script – Variaveis

Esta ae um assunto importante de ser visto, Shell Script. Principalmente para usuários Linux e SysAdmin de servidores Linux, utilizei muito em meu TCC para automatizar tarefas e até hoje escrevi apenas um post, acho que vale a pena retomar esse assunto visto que ajudaria muita gente com tudo que aprendi e uso hoje, principalmente em servidores.

E hoje abordarei sobre variáveis, a ideia é a mesma de outras linguagens de programação com a diferença de não ter que informar o tipo antes, e uma variável em shell script pode conter um valor, uma string ou a saída de um comando, vamos ver logo abaixo um exemplo básico.

#!/bin/bash

#Variavel NOME contendo tudo que estiver entre " "
NOME="Cleiton Rafael Bueno de Oliveira"
#Variavel ANO contendo o valor 2014
ANO="2014"
#Variavel VERSAO recebendo o valor 1.0
VERSAO='1.0'

#Quando for utilizar a variável deve-se inserir $ antes do nome da mesma
#caso contrario iríamos mostrar Seu nome: NOME no exemplo abaixo
echo "Seu nome: $NOME"
echo "Estamos no ano $ANO"
echo "Versao deste script $VERSAO"

O exemplo acima pode ser escrito em gedit, vim, vi, nano, emacs ou o editor que preferir, e no nosso caso foi salvo como exemplo1.sh, e salvo em um diretório projetos/shell script/ no /home, segue a saída do script:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo1.sh
Seu nome: Cleiton Rafael Bueno de Oliveira
Estamos no ano 2014
Versao deste script 1.0

Eu particularmente e alguns amigos utilizamos os nomes das variáveis em maiúsculo, mas não é nenhuma regra pode ser tudo minúsculo também, é uma questão de adaptação e cultura.
Vamos avançar e agora obter a saída de um programa e armazenar em uma variável, no exemplo2.sh abaixo:

#!/bin/bash

NOME="Cleiton Rafael Bueno de Oliveira"
ANO="2014"
VERSAO='1.0'
LISTAR_HOME="ls -1 $HOME"

echo "Seu nome: $NOME"
echo "Estamos no ano $ANO"
echo "Versao deste script $VERSAO"
echo "Arquivos/diretorios do home:"
echo $LISTAR_HOME

Mesmo exemplo anterior apenas inserimos o comando ls -1 no diretório /home/ do usuário atual, vamos analisar a saída:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo2.sh
Seu nome: Cleiton Rafael Bueno de Oliveira
Estamos no ano 2014
Versao deste script 1.0
Arquivos/diretorios do home:
ls -1 /home/cleiton/

Algo saiu errado, não era essa a saída, e sim listar todos diretórios e arquivos do meu home. Um detalhe importante que fiz questão de errar foi a maneira de inserir o comando ls, quando queremos executar um comando do Linux e capturar a saída deve-se colocar o mesmo dentro de ` comando ` ou $( comando ), vamos corrigir e verificar a saída.

#!/bin/bash

NOME="Cleiton Rafael Bueno de Oliveira"
ANO="2014"
VERSAO='1.0'
LISTAR_HOME=`ls -1 $HOME`

echo "Seu nome: $NOME"
echo "Estamos no ano $ANO"
echo "Versao deste script $VERSAO"
echo "Arquivos/diretorios do home:"
echo $LISTAR_HOME

Executando:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo2.sh
Seu nome: Cleiton Rafael Bueno de Oliveira
Estamos no ano 2014
Versao deste script 1.0
Arquivos/diretorios do home:
Workspace Ãrea de Trabalho cleiton codigo01.py Community Community.1 Dep1 Dep2 Documentos Documents Downloads examples.desktop Imagens Modelos moto.jpg PosInstalacao Projetos repo sdf tcc teste teste.tar

Legal, demos um ls no diretório do home atual e a saída foi exibida após eu inserir um echo(), agora tenho certeza que alguém deve ter notado aquele $HOME no meio do script e em lugar nenhum eu declarei ele, pois é, é verdade e essa é uma variável do sistema, como diversas outras que existem e é muito utilizada em shell script, vamos conhecer algumas e brincar com elas no shell script.

$USER Exibe o nome do usuário logado no shell
$PWD Exibe o diretório atual, no caso onde o script esta sendo executado
$HOME Exibe o diretório do usuário logado
$SHELL Exibe o shell utilizado
$OSTYPE Exibe o tipo do sistema operacional
$RANDOM Gera um numero randômico e exibe na tela
$DISPLAY Exibe o nome do computador e o numero do display
$UID Exibe o User ID de quem executou o script
$PATH Path do sistema atual
$LANG Exibe o idioma que o sistema esta usando

Então esta ae, como usei $HOME ele listou pra mim tudo do meu home, vamos fazer um shell script combinando com mais alguns, segue o exemplo3.sh.

#!/bin/bash

NOME="Cleiton Rafael Bueno de Oliveira"
ANO="2014"
VERSAO='1.0'
LISTAR_HOME=`ls -1 $HOME`

echo "Seu nome: $NOME"
echo "Estamos no ano $ANO"
echo "Versao deste script $VERSAO"
echo "Arquivos/diretorios do home:"
echo $LISTAR_HOME

echo -e "n"

# Use -e no echo quando deseja utilizar n, t, r ...
# Idem printf do C
echo -e "Voce esta logado com o usuario:\t\t\t\t\t$USER\n"
echo -e "O diretorio home deste usuarioi:\t\t\t\t$HOME\n"
echo -e "O diretorio onde este script esta sendo executado:\t\t$PWD\n"
echo -e "Path utilizado neste script:\t\t\t\t\t$PATH\n"

Creio que os comentários e o que já foi dito explica o script acima, vamos a saída:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo3.sh
Seu nome: Cleiton Rafael Bueno de Oliveira
Estamos no ano 2014
Versao deste script 1.0
Arquivos/diretorios do home:
Workspace Ãrea de Trabalho cleiton codigo01.py Community Community.1 Dep1 Dep2 Documentos Documents Downloads examples.desktop Imagens Modelos moto.jpg PosInstalacao Projetos repo sdf tcc teste teste.tar

Voce esta logado com o usuario: cleiton

O diretorio home deste usuario: /home/cleiton

O diretorio onde este script esta sendo executado: /home/cleiton/projetos/shell script

Path utilizado neste script: /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/usr/local/bin:/usr/bin:/bin

Agora algo importante saber, é possível alterar uma variável em tempo de execução? Ou melhor uma variável do sistema?
A resposta é sim, e vamos ver no exemplo4.sh.

#!/bin/bash

NOME="Cleiton Rafael Bueno de Oliveira"
ANO="2014"
VERSAO='1.0'

echo "Seu nome: $NOME"
echo "Estamos no ano $ANO"
echo "Versao deste script $VERSAO"

echo -e "n"

echo -e "Path utilizado neste script:\t\t\t\t\t$PATH\n"

PATH="$PATH:/home/cleiton/bin/"
#ou
#PATH="$PATH:$HOME/bin"
echo -e "Novo path:\t\t\t\t\t\t\t$PATH\n"

Saída do script:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo4.sh
Seu nome: Cleiton Rafael Bueno de Oliveira
Estamos no ano 2014
Versao deste script 1.0

Path utilizado neste script:                                    /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Novo path:                                                      /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/cleiton/bin/

Usei o exemplo de alterar o PATH porque eu uso assim, quando um script irá compilar usando gcc para ARM tenho um PATH no topo, ae depois tenho outro que compila para x86, e terminando o script o PATH do sistema não foi alterado, muito útil isso.
Temos mais um pouco de variáveis em shell script para ficar crack (rs), agora tem um certo tipo de variável muito conhecido como variáveis especiais, vamos conhecer:

$0 Exibe o nome do script
$? Exibe o estado do ultimo comando executado, 0 ou 1
$$ Exibe o PID do script
$_ Guarda o valor do ultimo parâmetro do ultimo comando executado
$* Exibe todos os parâmetros informados
$# Exibe o numero total de parâmetros passados
$@ Idem ao $*, acrescentando proteção
$! Exibe o PID do processo em background (job)
$1 Exibe o primeiro parâmetro informado
$8 Exibe o oitavo parâmetro informado

Vamos encerrar com o ultimo script reunindo as informações acima e mais algumas particularidades comentadas, segue o exemplo5.sh.

#!/bin/bash

NOME="Cleiton Rafael Bueno de Oliveira"
ANO="2014"
VERSAO='1.0'

echo "Esse script se chama $0"
echo "Seu PID: $$"

echo -e "\n"
echo "Voce informou $# parametros"
echo "Os parametros sao: $@"

#Retornando o numero de caracteres da variavel $NOME
echo -e "\n"
echo "Variavel NOME possui ${#NOME} caracteres"
echo "Nome: $NOME"
echo -e "\n"

#Remove string Oliveira do final do $NOME
echo -e "\n"
echo "Removendo o ultimo sobrenome"
echo "Nome: ${NOME%Oliveira}"

#Remove a string Cleiton do inicio de $NOME
echo -e "\n"
echo "Removendo o primeiro nome"
echo "Nome: ${NOME#Cleiton}"

#Cortando do caracter 15 em diante, e apos o 15 contar 5, entao:
#Cleiton Rafael Bueno de Oliveira
#1 15|12345|
echo -e "n"
echo "Apenas o sobrenome"
echo "Sobrenome: ${NOME:15:5}"

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo5.sh
Esse script se chama ./exemplo5.sh
Seu PID: 19779

Voce informou 0 parametros
Os parametros sao:

Variavel NOME possui 32 caracteres
Nome: Cleiton Rafael Bueno de Oliveira

Removendo o ultimo sobrenome
Nome: Cleiton Rafael Bueno de

Removendo o primeiro nome
Nome: Rafael Bueno de Oliveira

Apenas o sobrenome
Sobrenome: Bueno

Agora vamos passar alguns parâmetros na frente do script:

cleiton@linuxVM:~/projetos/shell script$ ./exemplo5.sh Cleiton 2014 Linux 1 2 3
Esse script se chama ./exemplo5.sh
Seu PID: 19950

Voce informou 6 parametros
Os parametros sao: Cleiton 2014 Linux 1 2 3

Variavel NOME possui 32 caracteres
Nome: Cleiton Rafael Bueno de Oliveira

Removendo o ultimo sobrenome
Nome: Cleiton Rafael Bueno de

Removendo o primeiro nome
Nome:  Rafael Bueno de Oliveira

Apenas o sobrenome
Sobrenome: Bueno

Essa parte de cortar a string nome e manipular foi um extra pra vocês verem o poder do shell script, com isso já é mais que suficiente para avançar em shell script e sabendo de todo esse poder da para automatizar e criar scripts bem legais.

Espero que tenham gostado, até a próxima!

Referências

http://gnulinuxbr.com/2010/03/18/variaveis-shell-script/
http://aurelio.net/shell/canivete/

Share Button

CC BY-NC-SA 4.0 Shell Script – Variaveis by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.