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/
Shell Script – Variaveis by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.