Você está na página 1de 53

Programação BASH

Índice

• BASH
• Conceito
• História
• Sintaxe: E/S, variáveis, arrays, operadores, Estruturas de decisão e repetição,
substituições e funções
• Opções avançadas: Sistema de ficheiros, Tarefas administrativas, Verificação
de performance, Logs e Sinais

Sistemas Operativos 2021/22 2


Cartoon...

Sistemas Operativos 2021/22 3


BASH Script

• BASH (Bourne-Again SHell)


GNU Bash ou simplesmente Bash
é um interpretador interativo de
comandos, um entre os diversos
tradutores entre o utilizador e o
sistema operativo conhecidos
como shell.

Sistemas Operativos 2021/22 4


História

•Bourne shell (sh)


•1977. Stephen Bourne, Bell Labs.
•C Shell (csh)
•1980. Bill Joy, Berkeley
•Korn Shell (ksh)
•1980. David Korn, Bell Labs.
•Bourne again shell (bash)
•1987. Brian Fox, GNU Project
Sistemas Operativos 2021/22 5
Sintaxe: E/S

#!/bin/sh
# Author : RV
# Copyright (c) 2021 ISLA Santarém
# Script : ex1.sh $chmod +x ex1.sh
$./ex1.sh
echo ”Qual é o seu nome?" Qual é o seu nome?
read NOME >Ricardo
echo ”Olá, $NOME" Olá, Ricardo
$
# -> utilize para comentar uma linha
read varname [more vars,]

read –p "prompt" varname [more vars,]

echo “Texto $var”

Sistemas Operativos 2021/22 6


Palavras reservadas

Sistemas Operativos 2021/22 7


Variáveis
Nome de Variável
• O nome de uma variável pode conter apenas letras (a a z ou A a Z), números (0
a 9) ou o caractere de sublinhado (_).
• Por convenção, as variáveis do shell Unix terão seus nomes em MAIÚSCULAS.

Definir Variável
• nome_variavel = valor_variavel

Acesso ao valor
• Para aceder ao valor armazenado de uma variável, usa-se o prefixo cifrão ($)
antes do seu nome.
Sistemas Operativos 2021/22 8
Argumentos de uma script

• ./nome_script.sh arg1 arg2 ... arg9


cmd arg arg arg arg arg arg ... arg
1 2 3 4 5 6 9

$0 $1 $2 $3 $4 $5 $6 ... $9

$# -> Número de argumentos


$* -> Todos os argumentos
$$ -> O PID do processo corrente

Sistemas Operativos 2021/22 9


Argumentos
#!/bin/sh
# Author : RV $./ex2.sh Ricardo Vardasca
# Copyright (c) 2021 ISLA Santarém Nome do Ficheiro: ./ex2.sh
# Script : ex2.sh Primeiro Parametro: Ricardo
Segundo Parametro: Vardasca
echo ”Nome do Ficheiro: $0" Valores: Ricardo Vardasca
echo ”Primeiro Parametro: $1" Valores: Ricardo Vardasca
echo "Segundo Parametro: $2" Numero total de Parametros: 2
echo ”Valores: $@"
echo ”Valores: $*"
echo ”Numero total de Parametros: $#"

Existem parâmetros especiais que permitem aceder todos os argumentos da linha de comando de uma só vez.
$* e $@ irão agir da mesma forma, a menos que estejam entre aspas duplas, "".

Ambos os parâmetros especificam os argumentos da linha de comando. No entanto, o parâmetro especial "$*"
pega na lista inteira como um argumento com espaços entre os elementos e o parâmetro especial "$@" pega a
lista inteira e separa-a em argumentos separados.
Sistemas Operativos 2021/22 10
Arrays
Definir Valores do Array
nome_array[índice] = valor #!/bin/sh
# Author : RV
Aceder a Valores do Array # Copyright (c) 2021 ISLA Santarém
${nome_array[índice]} # Script : ex3.sh
$./ex3.sh
NAME[0]=”Marcelo" Primeiro Indice: Marcelo
NAME[1]=”Nuno" Segundo Indice: Rebelo
NAME[2]=”Rebelo"
NAME[3]=”Sousa"
echo ”Primeiro Indice: ${NAME[0]}"
echo "Segundo Indice: ${NAME[2]}"

Sistemas Operativos 2021/22 11


Operadores
Aritméticos

Lógicos

Relativos

Sistemas Operativos 2021/22 12


Operadores

Sistemas Operativos 2021/22 13


Expressão de controlo IF

Meaning Numeric String


if condition Greater than -gt
then Greater than or equal -ge
statements Less than -lt
elif condition Less than or equal -le
then Equal -eg = or ==
statements opcional Not equal -ne !=
else str1 is less than str2 str1 < str2
statements str1 is greater str2 str1 > str2
fi String length is greater than zero -n str
String length is zero -z str

Sistemas Operativos 2021/22 14


Expressão de controlo IF

#!/bin/bash
#! /bin/bash

read -p ”Valor das receitas: " Receita # testeFicheiro.sh

read -p ”Valor das despesas: " Despesa


if [ $# -lt 1 ]; then
let Saldo=$Receita-$Despesa echo "Usar: testeFicheiro ficheiro"
exit 1
if [ "$Saldo" -eq "0" ]; then fi
echo ”Receita igual à despesa." if [[ ! -f "$1" || ! -r "$1" || ! -w "$1" ]]
elif [ "$Saldo" -gt "0" ]; then then
echo ”Lucro de: " $Saldo
echo "Ficheiro $1 não é accessível"
else
exit 1
echo ”Prejuízo de: " $Saldo
fi
fi

Sistemas Operativos 2021/22 15


Expressão de controlo case

case word in
pattern1) command-list1
;;
pattern2) command-list2
;;
patternN) command-listN
;;
esac

Sistemas Operativos 2021/22 16


Expressão de controlo case
#!/bin/bash
echo ”Introduza S para ver todos ficheiros incluíndo os ocultos"
echo ”Introduza N para ver todos ficheiros não ocultos"
echo ”Introduza X para sair"

read -p ”Introduza a sua opção: " opcao

case $opcao in
S) echo ”Mostrar todos ficheiros..."
ls -a ;;
N) echo " Mostrar todos ficheiros não ocultos..."
ls ;;
X) exit 0 ;;

*) echo ”Opção errada!"; exit 1 ;;


esac
Sistemas Operativos 2021/22 17
Estrutura de repetição WHILE

while [ expression ]
do
command-list
done

Sistemas Operativos 2021/22 18


Estrutura de repetição WHILE

#!/bin/sh
0
a=0 10
while [ "$a" -lt 10 ] # ciclo1 210
do 3210
b="$a" 43210
while [ "$b" -ge 0 ] # ciclo2 543210
do echo -n "$b " 6543210
b=`expr $b - 1` 76543210
done 876543210
echo a=`expr $a + 1` 9876543210
done

Sistemas Operativos 2021/22 19


Estrutura de repetição FOR

for variable in argument-list


do
commands
done

Sistemas Operativos 2021/22 20


Estrutura de repetição FOR

#!/bin/bash
7
9
for i in 7 9 2 3 4 5
2
do 3
echo $i 4
5
done

Sistemas Operativos 2021/22 21


Estrutura de repetição UNTIL

until [ expression ]
do
command-list
done

Sistemas Operativos 2021/22 22


Estrutura de repetição UNTIL

#!/bin/bash 20
19
18
COUNTER=20
17
until [ $COUNTER -lt 10 ] 16
do 15
echo $COUNTER 14
13
let COUNTER-=1
12
done 11

Sistemas Operativos 2021/22 23


Substituições

#!/bin/sh
Valor de a é 10
a=10
echo -e ”Valor de a é $a \n"

#!/bin/sh

DATE=`date` Data é Wed Jan 6 20:35:57 MST


echo "Data é $DATE" 2021
USERS=`who | wc -l` Utilizadores logados: 1
echo ”Utilizadores logados: $USERS" Uptime é 20 days, 14:03
UP=`date ; uptime`
echo "Uptime é $UP"

Sistemas Operativos 2021/22 24


Substituições

#!/bin/sh

echo ${var:-"Variable is not set"}


echo "1 - Value of var is ${var}"
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"

Sistemas Operativos 2021/22 25


Redireção de comandos

>: Redireciona stdout para um ficheiro, cria o ficheiro se não


estiver existir, caso contrário, o sobrescreve

<: Aceita a entrada de um ficheiro.

>>: Cria o ficheiro se não existir, caso contrário, acrescenta nele.

<<: Força a entrada de um comando a ser a entrada da shell, o


que até que haja uma linha que contenha apenas o rótulo.
cat >> mshfile <<.

|: pipe, semelhante a ">",

Sistemas Operativos 2021/22 26


Redirecionamento de comandos

INPUT 0

echo

OUTPUT 1 ERROR 2

A Pipe!

INPUT 0
INPUT 0

wc env

OUTPUT 1 ERROR 2 OUTPUT 1 ERROR 2

Sistemas Operativos 2021/22 27


Redirecionamento de comandos

$ who > users.txt #grava no ficheiro os utilizadores com sessão iniciada no sistema

#!/bin/sh

cat << EOF This is a simple lookup program


This is a simple lookup program for good (and bad) restaurants
for good (and bad) restaurants in Cape Town.
in Cape Town.
EOF

Sistemas Operativos 2021/22 28


Funções

function_name () {
list of commands
}
#!/bin/sh
# isla.sh
Isla () {
echo ”ISLA Santarém" $./isla.sh
} ISLA Santarém

# Invocar a função
Isla

Sistemas Operativos 2021/22 29


Funções (Parâmetros)

#!/bin/sh
# isla.sh
Isla () {
echo ”ISLA Santarém $1/$2" $./isla.sh
} ISLA Santarém 2020/2021

# Invocar a função
Isla 2020 2021

Sistemas Operativos 2021/22 30


Funções (Retorno)

#!/bin/sh
# isla.sh
Isla () {
echo ” echo ”ISLA Santarém $1/$2”
return 10
}
$./isla.sh
# Invocar a função ISLA Santarém 2021/2022
Isla 2021 2022 Valor de retorno é 10

# Chamada de retorno
ret=$?
echo ”Valor de retorno é $ret"

Sistemas Operativos 2021/22 31


Funções (encadeadas)

#!/bin/sh
#func_enc.sh

# Chamada de uma função por outra


funcao_um ()
{
echo ”A primeira funcao..." funcao_dois $./func_enc.sh
} A primeira funcao...
A segunda funcao...
funcao_dois () {
echo ”A segunda funcao..."
}

# Chamada da função um
funcao_um

Sistemas Operativos 2021/22 32


Permissões de ficheiros

• Ao usar o comando (ls -l) será mostrada uma lista de ficheiros e as


suas permissões:

-rwxrwxr-x 1 gradvohl gradvohl 5224 Dec 30 03:22 hello


-rw-rw-r-- 1 gradvohl gradvohl 221 Dec 30 03:59 hello.c
-rw-rw-r-- 1 gradvohl gradvohl 1514 Dec 30 03:59 hello.s
drwxrwxr-x 7 gradvohl gradvohl 1024 Dec 31 14:52 posixu

Permissões Grupo

Dono

Sistemas Operativos 2021/22 33


Permissões de ficheiros

• Linux/Unix proveem três tipos de permissões:


• Read – permissão para ler o ficheiro/diretório
• Write – permissão para escrever no ficheiro/diretório
• EXecute – permissão para executar o ficheiro (script ou programa).

-rwxrwxrwx
Permissões dos outros
Permissões do grupo
Permissões do utilizador
flag de Diretório (d=diretório; l=link)

Sistemas Operativos 2021/22 34


Comandos de processos
For this purpose Use this Command Examples

To see currently running process ps $ ps

To stop any process by PID i.e. to kill process kill {PID} $ kill 1012

To stop processes by name i.e. to kill process killall {Proc-name} $ killall httpd

To get information about all running process ps -ag $ ps -ag

To stop all process except your shell kill 0 $ kill 0


For background processing (With &, use to put
particular command and program in linux-command & $ ls / -R | wc -l &
background)
To display the owner of the processes along
ps aux $ ps aux
with the processes
For e.g. you want to see whether
To see if a particular process is running or not. Apache web server process is
For this purpose you have to use ps command ps ax | grep {Proc-name} running or not then give command
in combination with the grep command $ ps ax | grep httpd

To see currently running processes and other $ top


information like memory and CPU usage with top Note that to exit from
top command press q.
real time updates.

To display a tree of processes pstree $ pstree

Sistemas Operativos 2021/22 35


Ficheiros
Alguns nomes de ficheiros são especiais: pwd
/ Diretório raiz
Mostra a localização atual
. Diretório atual
Ex: pwd
.. Diretório pai (diretório anterior)
~ Diretório home mkdir
Cria um Diretório
Ex: mkdir so
cd
Mudança de Diretório
Ex: cd / cat
Ir para o diretório raiz Exibe o Conteúdo de um ficheiro
ls Ex: cat aula.txt
Listar os ficheiros e diretório do local corrente Ex: cat –n aula.txt
Ex: ls cp
Variações Copia de ficheiros
ls –a Ex: cp aula.txt aula2.txt
ls –l
Ex: cp aula.txt /tmp

Sistemas Operativos 2021/22 36


Ficheiros e comandos
date clear
Exibe e altera a data e hora do sistema Limpar a tela
Ex: date Ex: clear
Ex: date +%d/%m/%Y df
mv
Mover ou renomear ficheiros Saber a quantidade de disco ocupada
Ex: mv aula.txt aula3.txt Ex: df –H
Ex: mv aula3.txt /aula/aula2 free
Verificar a utilização da memória RAM
rm ou rmdir Ex: free -m
apagar ficheiros e diretórios
Ex: rm aula2.txt
Ex: rm –d aula2
man
Manual on-line dos comando do linux
Ex: man date
Ex: man cp

Sistemas Operativos 2021/22 37


Administração de utilizadores

Sistemas Operativos 2021/22 38


Administração de utilizadores

Sistemas Operativos 2021/22 39


Comandos de performance

Sistemas Operativos 2021/22 40


Logs

Sistemas Operativos 2021/22 41


Sinais

Sistemas Operativos 2021/22 42


Cópias de segurança

Comando TAR

❑ Utilizado para arquivar ficheiros. “Permite juntar vários


ficheiros em um só”.

❑ Pode ser utilizado com compactadores para diminuir o


tamanho do ficheiro.

❑ Principais extensões: tar; tar.gz; tar.tgz; tar.bz2, etc.

Sistemas Operativos 2021/22 43


Cópias de segurança
tar [opções] [arquivo-destino] [arquivos-origem]

Exemplos:
tar -cf index.txt.tar index.txt
Cria um ficheiro chamado index.txt.tar que armazenará o ficheiro index.txt. Usando o comando ls -la pode verificar-
se que o ficheiro index.txt foi somente arquivado (sem compactação), isto é útil para juntar diversos ficheiros num
só.

tar -xf index.txt.tar - Desarquiva o ficheiro index.txt criado pelo comando anterior.

tar -czf index.txt.tar.gz index.txt


O mesmo que o exemplo de arquivamento anterior, só que agora é usado a opção -z (compactação através do
programa gzip). Pode verificar-se pelo comando ls -la que o arquivo index.txt foi compactado e depois arquivado no
ficheiro index.txt.tar.gz (pode ser também chamado de index.txt.tgz que também identifica um
ficheiro .tar compactado pelo gzip

Sistemas Operativos 2021/22 44


Cópias de segurança

tar -xzf index.txt.tar.gz - Descompacta e desarquiva o ficheiro index.txt.tar.gz criado


com o comando anterior.

tar -t index.txt.tar - Lista o conteúdo de um ficheiro .tar.

tar -tz index.txt.tar.gz - Lista o conteúdo de um ficheiro .tar.gz.

Sistemas Operativos 2021/22 45


Sincronização

Comando rsync

❑ Permite sincronizar o conteúdo de duas pastas, transferindo apenas


as modificações.

❑ Não trabalha apenas comparando ficheiro a ficheiro, mas também


comparando o conteúdo de cada um. Se apenas uma pequena parte
do ficheiro foi alterada, o rsync transferirá apenas essa parte, sem
copiar novamente todo o ficheiro.

Sistemas Operativos 2021/22 46


Sincronização

Exemplos:
$ rsync -av /mnt/hda6/trabalho/ /mnt/backup/
A opção "-a" (archive) faz com que todas as permissões e atributos dos ficheiros sejam mantidos,
da mesma forma que ao criar os ficheiros com o tar, e o "v" (verbose) mostra o progresso no ecrã.

$ rsync -av /mnt/backup/trabalho/ /mnt/hda6/trabalho


Restaurar os ficheiros que foram copiados no passo anterior.

$ rsync -av --delete /var/ /mnt/sdb1/ >> /tmp/rsync.log


Copia o conteúdo da pasta var para /mnt/sdb1, removendo os ficheiros que foram excluídos em
/var/ e gera um log em rsync.log.

Sistemas Operativos 2021/22 47


Sincronização

Exemplos:
rsync -az -e "ssh -i $CHAVE_PRIVADA -C“ origem destino
Realiza a cópia dos ficheiros de origem para o destino, através do shell remoto (SSH), utilizando
uma chave como mecanismo de autenticação.
-az -> Mantém os atributos dos ficheiros e realiza compactação dos dados.
-e -> define o shell remoto que será utilizado.
-C -> Realiza compactação dos dados na transmissão.

Sistemas Operativos 2021/22 48


Agendamento de tarefas

O cron é um daemon que


permite o agendamento da
execução de um
comando/programa para um
determinado dia/mês/ano/hora.
É muito usado em tarefas de
arquivamento de logs,
verificação da integridade do
sistema e execução de
programas/comandos em
horários determinados.

Sistemas Operativos 2021/22 49


Agendamento de tarefas

Ficheiro crontab

Minuto - Valor entre 0 e 59

Hora - Valor entre 0 e 23

Dia do Mês - Valor entre 0 e 31

Mês - Valor entre 1 e 12 (identificando os meses de Janeiro a Dezembro)

Dia da Semana - Valor entre 0 e 7 (identificando os dias de Domingo a Sábado). Note que tanto 0 e 7 equivalem
a Domingo.

Utilizador - O utilizador especificado será usado para executar o comando (o utilizador tem de existir).

Comando - Comando que será executado. Podem ser usados parâmetros normais usados na linha de comando.

Sistemas Operativos 2021/22 50


Agendamento de tarefas
Os campos do ficheiro são separados por um ou mais espaços ou tabulações. Um asterisco * pode ser usado
nos campos de data e hora para especificar todo o intervalo disponível. O hífen - serve para especificar períodos
de execução (incluindo a o número inicial/final). A vírgula serve para especificar lista de números. Passos
podem ser especificados através de uma /.
O ficheiro gerado em /var/spool/cron/crontabs/[usuário] pelo crontab tem o mesmo formato do /etc/crontab
exceto por não possuir o campo utilizador (UID), pois o nome do ficheiro já identifica o utilizador no sistema.
Para editar um ficheiro de utilizador em /var/spool/cron/crontabs ao invés de editar o /etc/crontab deve
usar-se:
O crontab -e, para listar as tarefas daquele utilizador
O crontab -l e para apagar o ficheiro de tarefas do utilizador
O crontab -r (adicionalmente pode-se remover somente uma tarefa através do crontab -e apagando-se
apenas a linha correspondente).

OBS: Não esqueça de incluir uma linha em branco no final do ficheiro, caso contrário o último comando não
será executado.

Sistemas Operativos 2021/22 51


Agendamento de tarefas
00 10 * * * root sync
# Executa o comando sync todos os dia às 10:00

00 06 * * 1 root updatedb
# Executa o comando updatedb todas as segunda-feira às 06:00.

10,20,40 * * * * root runq


# Executa o comando runq todos os dias e a toda as horas em 10, 20 e 40 minutos.

*/10 * * * * root fetchmail


# Executa o comando fetchmail de 10 em 10 minutos todos os dias

15 0 25 12 * root echo "Feliz Natal"|mail joão


# Envia um e-mail as 0:15 todo os dias 25/12 para o joão desejando um feliz natal.

30 5 * * 1-6 root poff


# Executa o comando poff automaticamente às 5:30 de segunda-feira a sábado.

Sistemas Operativos 2021/22 52


Bibliografia

Sistemas Operativos 2021/22 53

Você também pode gostar