Abrir menu principal

Shell script

linguagem de programação
Text document with red question mark.svg
Este artigo ou secção contém fontes no fim do texto, mas que não são citadas no corpo do artigo, o que compromete a confiabilidade das informações (desde junho de 2017). Ajude a melhorar este artigo inserindo fontes.
Bash executando comandos

Shell script é uma linguagem de script usada em vários sistemas operativos (operacionais), com diferentes dialetos, dependendo do interpretador de comandos utilizado. Um exemplo de interpretador de comandos é o bash, usado na grande maioria das distribuições GNU/Linux.

A maior parte dos usuários classificam shell script como uma linguagem de fácil aprendizagem. O primeiro passo é, saber o que se deseja fazer, então ver qual o código que executa este comando em shell e aí criar, basta escrever o código em algum editor de texto e salvar. Depois de salvo você tem que executar o arquivo, dessa forma:

./Nome do arquivo

No Linux o script deve ter permissão de execução, isto pode ser feito com o comando chmod +x "arquivo", para exibir um manual do bash ou mesmo do comando 'chmod', digite na linha de comando 'man bash' ou 'man chmod' (sem aspas).

É possível executar o arquivo mesmo sem modificar a permissão de execução, por exemplo, se for um arquivo escrito para ser executado pelo bash, usar:

sh ./"Nome do arquivo, sem aspas"

ShellEditar

Antes de saber o que é um script em shell, é importante saber o que é um Shell.

Na linha de comandos de um shell, podemos utilizar diversos comandos um após o outro, ou mesmo combiná-los numa mesma linha. Se colocarmos diversas linhas de comandos em um arquivo texto simples, teremos em mãos um Shell Script, ou um script em shell, já que Script é uma descrição geral de qualquer programa escrito em linguagem interpretada, ou seja, não compilada. Outros exemplos de linguagens para scripts são o PHP, Perl, Python, JavaScript e muitos outros. Podemos então ter um script em php, um script perl e assim em diante.

Uma vez criado, um ShellScript pode ser reutilizado quantas vezes for necessário. Seu uso, portanto, é indicado na automação de tarefas que serão realizadas mais de uma vez. Todo sistema Unix e similares são repletos de scripts em shell para a realização das mais diversas atividades administrativas e de manutenção do sistema.

Os arquivos de lote (batch - arquivos *.bat) do Windows são também exemplos de ShellScripts, já que são escritos em linguagem interpretada e executados por um Shell do Windows, em geral o command.com ou hoje em dia o cmd.exe. Os Shells do Unix, porém, são inumeras vezes mais poderosos que o interpretador de comandos do Windows, podendo executar tarefas muito mais complexas e elaboradas.

Os scripts shell podem ser agendados para execução através da tabela crontab, entre outras coisas. É uma ferramenta indispensável aos administradores de sistemas Unix.

O Shell mais comum e provavelmente o que possui mais scripts escritos para ele é também um dos mais antigos e simples, o sh. Este shell está presente em todo o sistema tipo Unix, incluído o Linux, FreeBSD, AIX, HP-UX, OpenBSD, Solaris, NetBSD, Irix, etc. Por ser o shell nativo mais comum é natural que se prefira escrever scripts para ele, tornando o script mais facilmente portável para outro sistema.

Os Shells não estão diretamente associados a um ou outro tipo de Unix, embora várias empresas comerciais tenham suas próprias versões de Shell. No software livre o Shell utilizado em um sistema em geral é exatamente o mesmo utilizado em outro. Por exemplo, o bash encontrado no Linux é o mesmo shell bash encontrado no FreeBSD e pode também facilmente ser instalado no Solaris, Windows através do Cygwin [1] ou outros sistemas Unix comerciais para passar a ser utilizado como interface direta de comandos ou como interpretador de scripts. O mesmo acontece com o tcsh e vários outros shells desenvolvidos no modelo de software livre.

CaracterísticasEditar

Os scripts shell podem conter estruturas de programação tais como:

  • estruturas de decisão (if)

Recurso utilizado para dar sequencia em fluxos de execução baseado decisões. Cuja sintaxe é:

- Condição Verificada é o teste que definirá se controle deve ser passado para dentro do bloco then, observe que esse teste é feito sobre a saída de um comando.
- Ação são comandos a serem executados em caso verdadeiro da condição verificada.
  • Operadores para números
- -eq - Verifica se é igual,
- -ne - Verifica se é diferente,
- -lt - Verifica se é menor,
- -gt - Verifica se é maior,
- -le - Verifica se é menor ou igual,
- -ge - Verifica se é maior ou igual.
  • Operadores para Texto
- != - Verifica se é diferente,
- = - Verifica se é igual.
  • Operadores Lógicos
- ! - Lógica NOT,
- -o - Lógica OU, (OR) ou ||,
- -a - Lógica E, (AND) ou &&.
  • Operador para arquivos/diretórios
- -d - Verifica se é diretório,
- -f - Verifica se é arquivo,
- -e - Verifica se existe.

Ex:

# !/bin/bash
# Uso de Estrutura de Decisão
clear

echo 'opções'
echo '======'
echo '< 1 > -> Data do Sistema'
echo '< 2 > -> Uso do Sistema'

read opcao

if [ "$opcao" -eq 1 ]
then
	echo 'Data do sistema: ' && date

elif [ "$opcao" -eq 2 ]
then

	echo 'Uso do disco: ' && df -Th
fi
  • estruturas de repetição (for)(while)
  • Estrutura de repetição for

Permite que ações de iteração sejam executadas sobre determinados comandos ou variáveis até que a condição seja satisfeita.

# !/bin/bash

clear

echo "DIAS DA SEMANA"
for dia in seg ter qua qui sex sab dom
do
	echo "$dia"
done
  • Estrutura de Repetição While

Em situações onde sabemos até onde o loop irá realizar uma contagem o ideal é usar o for entretanto em cenarios onde a iteração deve cessar somente após se satisfazer uma condição o uso do laçõ while é mais indicado: Ex:

# /bin/bash


clear
var=1
while [ $var -le 7 ]
do
	echo "Valor de var: $var"
	var=$((var+1))
done
  • funções e argumentos

Ex:

# !/bin/bash
# REALIZAR BACKUP DO DIR


echo -e " \033[1;33m Digite o caminho de origem.: \033[0m  "
read DIR_ORIGEM

clear

echo -e " \033[1;34m Digite o caminho de destino.: \033[0m "
read DIR_DESTINO

clear

verifica_argumentos(){

	if [ $# -lt 1 ];
	then
	   echo "Faltou informar um dos argumentos (parametros) necessarios!"
	   exit 1
	fi
}

copia_arquivos(){

	verifica_argumentos

	clear

	echo "Realizando backup..."

	#Verificando se o dir de destino existe

	if ! [ -d $DIR_DESTINO ]
	then
		mkdir $DIR_DESTINO
		echo "Diretorio de Destino Criado"
	fi


	#COPIANDO ARQUIVOS

	for arq in `ls $DIR_ORIGEM`
	do
		cp /$DIR_ORIGEM/$arq $DIR_DESTINO/$arq.bak
	done	

}

copia_arquivos
  • definições de variáveis e escopo destas

Variáveis são definidas pela nomenclatura NOME_VARIAVEL="Valor da Variável". O valor pode ser tanto numérico quanto texto.

Nome="Jose"

Se quisermos acessá-la, basta fazer referência a ela com o caractere $ (cifrão) antes do nome: o comando echo $Nome, por exemplo, retornará a palavra "Jose".

Variáveis de ambiente

As variáveis de ambiente independem da definição do usuario. Elas são criadas automaticamente, no momento em que se faz o login no sistema.

Ex:

   PATH: define diretórios de procura por programas executados no shell;
   USER: informa o nome do usuário do shell;
   HOME: informa o caminho do diretório home do usuário;
   PWD: diretório atual;

Exemplos de usoEditar

Apagar arquivos velhosEditar

Apagar periodicamente arquivos mais velhos que 30 dias do diretório /tmp:

#!/bin/bash

cd /tmp
find . -type f -mtime +30 -delete

Este seria o conteúdo de um shell script que sempre que fosse executado apagaria arquivos com data de modificação maior que 30 dias a partir do diretório /tmp do sistema de arquivos.

Notem que ele é nada mais do que uma associação de 2 comandos (cd e find) em um arquivo para facilitar a repetição da tarefa. Este poderia ser, por exemplo, o conteúdo do arquivo /bin/limpatmp.sh e poderíamos chamar este script pela linha de comandos sempre que desejássemos repetir esta ação:

$ limpatmp.sh

Onde o símbolo "$" representa o prompt de comandos. Do ponto de vista do usuário este seria mais um comando disponível para uso.

Os scripts em shell são também muito empregados junto à inicialização do sistema (para auto-iniciar tarefas) ou como mini-aplicativos, que facilitam tarefas dos usuários, tais como montagem de dispositivos, menus de ajuda, etc.

Sua primeira linha obrigatoriamente começa com um "#!" (que não se deve confundir com um comentário qualquer, pois realmente é uma exceção; este par se chama, em inglês, de shebang), informando diretamente ao núcleo qual interpretador ele deverá usar, juntamente com seu caminho, de acordo com a necessidade de cada caso. Exemplo:

#!/bin/bash

Em seguida, são adicionados os comandos desejados, um por linha, ou separados por ponto e vírgula. Exemplo:

mount -t reiserfs /dev/hda1 /mnt/hda1
ls /mnt/hda1
cp -r /mnt/hda1/* /home/user/backup
umount /dev/hda1

Por fim, dá-se a permissão de execução a este arquivo de texto simples ("chmod +x arquivo").

Data anteriorEditar

#!/bin/bash
# Função em Bash para retornar a data anterior, levando em conta o mês e ano.
fn_data_anterior()
{
   DIA=$D
   MES=$M
   ANO=$A

   # Dado DIA, MES e ANO numéricos, obtém a data do dia anterior
   DIA=`expr $DIA - 1`
   if [ $DIA -eq 0 ]; then
      MES=`expr $MES - 1`
      if [ $MES -eq 0 ]; then
         MES=12
         ANO=`expr $ANO - 1`
      fi
      DIA=`cal $MES $ANO`
      DIA=`echo $DIA | awk '{ print $NF }'`
   fi
}

ano=`date +%Y`;
mes=`date +%m`;
let dia=10\#`date +%d`;

if (( $dia<10 ));
  then
    j=0$dia;
else
    j=$dia;
fi
dia=$j;
j="";

D=$dia
M=$mes
A=$ano

fn_data_anterior

echo $DIA $MES

Veja tambémEditar

Referências

Ligações externasEditar