Um shell script nada mais é que um arquivo texto, onde digitamos uma serie de comandos a serem executados, um por linha. Ele é muito útil, por exemplo, para automatizar alguma tarefa repetitiva. Vejamos um primeiro exemplo:
#!/bin/bash date +"Iniciando backup do dia %d/%m/%Y as %H:%M" echo "Tamanho dos diretórios :" du -sh /bin /sbin tar -czf /tmp/backup-binarios.tar.gz /bin /sbin date +"Encerrando backup do dia %d/%m/%Y as %H:%M"
Os shells atuais, como o bash, que utilizamos por padrão em quase todas as distribuições Linux incorporaram uma serie de funcionalidades, valendo destacar:
if
, case
);for
, while
);As variáveis de um shell script são semelhantes às de um programa escrito em outra linguagem, com a diferença principal de que elas não possuem tipo. Podemos definir nossas próprias variáveis ou utilizar algumas que já são definidas pelo próprio shell.
#!/bin/bash VAR="chocolate" echo "Eu gosto de comer $VAR amargo."
#!/bin/bash echo -n "Digite o nome de uma comida : " read VAR echo "$USER gosta de $VAR."
Para verificar a lista de todas as variáveis existentes automaticamente, utilize o comando set
. Apesar das variáveis não possuírem tipo, elas podem ser utilizadas em operações aritméticas básicas:
#!/bin/bash echo -n "Valor 1 : " read VAR1 echo -n "Valor 2 : " read VAR2 VAR3=$[$VAR1+$VAR2] echo "Soma = $VAR3"
No bash argumentos da linha de comando são variáveis especiais, com a seguinte nomenclatura:
$0
: Nome do script;$1
: Primeiro argumento;$2
: Segundo argumento;#!/bin/bash echo "Nome do script = $0" VAR3=$[$1+$2] echo "Soma dos argumentos 1 e 2 = $VAR3"
Exemplo de execução:
aluno@debian:~$ ./soma.sh 5 9
As estruturas de decisão if
e case
do bash funcionam de forma semelhante às de uma linguagem tradicional. Vejamos os exemplos a seguir:
#!/bin/bash #Realiza backup de acordo com o dia da semana DIA_SEMANA=`date +%u` if [ $DIA_SEMANA -eq 1 ] then echo "Hoje é segunda, realizando backup completo" # Comandos para backup completo # ... # ... else echo "Realizando backup incremental" # Comandos para backup incremental # ... # ... fi
#!/bin/bash # Configura placa de rede de acordo com opção passada pela linha de comando (casa ou trabalho) case "$1" in casa) ifconfig eth0 192.168.1.100 netmask 255.255.255.0 route add default gw 192.168.1.1 ;; trabalho) dhclient eth0 ;; esac
As estruturas de repetição for
e while
do bash também funcionam de forma semelhante às de uma linguagem tradicional. Uma funcionalidade importante do for
é sua habilidade de utilizar nomes de arquivos em cada iteração, como será visto em um dos exemplos a seguir:
#!/bin/bash # Imprime o tamanho e espaço em uso do /home, "dorme" por 15 segundos, repete (10 vezes). for i in {1..10} do df -h /home sleep 15 done
#!/bin/bash # Imprime o tamanho e espaço em uso do /home, "dorme" por 15 segundos, repete (indefinidamente). while (true) do df -h /home sleep 15 done
#!/bin/bash # Cria uma cópia de todos os arquivos txt do diretório atual for i in *.txt do cp $i backup-$i.txt done