Universidade Tuiuti do Paraná Faculdade de Ciências Exatas Sistemas Operacionais III - CSTR Shell Script “Meu Deus do Shell! Porque eu não optei pelo Linux antes?”1 [1] NEVES, Júlio César Profº André Luiz [email protected] Conteúdo programático ● Fundamentos de Shell ● Comandos básicos ● Principais arquivos/diretórios de configuração ● Comandos de rede ● Comandos avançados ● Tipos de variáveis e atribuição ● Variáveis de ambiente e variáveis especiais ● Trabalhando com arquivos de texto FHS - Permissões - Filtros - SED - Editores de texto ● Operadores do Shell ● Estrutura de decisão ● Laços ● Funções ● Expressões regulares Profº André Luiz [email protected] O que é Shell Script? Shell é uma interface textual que interpreta os comandos existentes em um sistema operacional e os envia ao kernel imprimindo posteriormente o resultado do processamento na tela. “Embora seja verdade que haja ferramentas GUI disponíveis para gerenciar praticamente tudo em um sistema GNU/Linux, você precisa ter conhecimento sólido sobre utilitários de linha de comando para se preparar melhor para se trabalhar com qualquer distribuição Linux.” (PRITCHARD; PESSANHA; STANGER; DEAN; LANGFELDT, 2007,P. 53) O que é Shell Script? O SHELL original para sistemas UNIX foi escrito por Steve Bourne e se chamava simplesmente sh. O SHELL padrão de sistemas Linux é o BASH (BOURNEAGAIN SHELL), que é uma variante GNU de sh. O que é Shell Script? Shell, é um interpretador de comandos que analisa o texto digitado na linha de comando e os executam. Na linha de comandos de um shell, podemos utilizar diversos comandos um após o outro, ou mesmo combiná-los numa mesma linha ( ; && | tee \ ). Se colocarmos diversas linhas de comandos em um arquivo texto simples, teremos em mãos um Shell Script, ou um script em shell. Existe mais de um Shell? Exemplos de Shell: ● csh: É a shell mais utilizada em sistemas como *BSD ou Xenix. A sua estrutura de comandos é similar á Linguagem C. ● sh: Ou Bourne Shell é a shell pré-defenida com o Unix (1977). Desde a versão 7 substituindo a tcsh, esta costuma a ser a shell pré-defenida para o root. ● bash: (Bourne-Again SHell) Muito similar a sh, esta é a shell mais utilizada por conter características como: Auto-Complete, podemos personalizar todo o output de uma forma simples,entre outras.... ● tcsh: Compatível e semelhante a csh. ● ksh: Considerada a mais popular no sistema Unix, tendo todas as funções do sh. Korn Shell foi a primeira a introduzir recursos avançados. ● zsh: Z Shell tem como grande vantagem um enorme interpretador de comandos E os interpretadores de comandos? Interpretadores de comandos são programas de computador responsáveis por tomar as ações efetivas conforme a orientação do usuário através de comunicação textual. Exemplos de Interpretadores de comandos: ● csh ● perl ● sh ● expect ● bash ● awk ● tcsh ● Basic ● ksh ● Vbscript ● zsh ● PHP ● python Qual a diferença entre um compilador e um interpretador? Compilador: É um programa responsável por gerar, a partir de de um programa escrito em linguagem de alto nível, um programa em linguagem de máquina, não executável. As linguagens de alto nível não possuem nenhuma relação direta com a máquina, ficando esta preocupação para o compilador. Exemplos: C, C++, Delphi, Visual Basic, etc ... Interpretador: Interpretador é considerado um tradutor que não gera código objeto. A partir de um programa fonte, escrito em linguagem de alto nível, o interpretador, no momento da execução do programa, traduz cada instrução e a executa em seguida. Exemplo de linguagens interpretadas: bash, sh, basic, VBscript, PHP, etc... Linguagens “Híbridas”: Interpretada e compilada. Ex. Python, java. Onde encontro o Shell? O Sistema Operacional é o código executor das chamadas de sistemas. Onde encontro o Shell? Shell é fundamentalmente uma interface entre o Sistema Operacional e o seu usuário. Como funciona um Shell? Para inicarmos os estudos sobre Shell Script vamos utilizar o bash (/sbin/bash). O BASH permite a execução de seqüências de comandos direto no prompt do sistema ou escritas em arquivos de texto, conhecidos como shell scripts. O BASH é o shell desenvolvido para o projecto GNU, da Free Software Foundation, que se tornou padrão nas várias distribuições Linux. Pode ser usado também com outros sistemas operacionais, como o Unix. É compatível com o Bourne shell (sh), incorporando os melhores recursos do C shell (csh) e do Korn Shell (ksh). Como funciona um Shell? Pode-se pode customizar o ambiente do bash utilizando alguns arquivos/diretórios como: ● ● ● ● /etc/profile /etc/skel .bash_profile .bash_rc Importante: Nos sistemas GNU/Linux nomes de arquivos são case-sensitive, ou seja, distinguem maiúsculas de minúsculas e vice-versa. TESTE != Teste != teste Como funciona um Shell? O ambiente de uma sessão SHELL tem seu comportamento alterado de acordo com o conteúdo de algumas variáveis de ambiente, por exemplo: BASH HOSTNAME USER USERNAME PATH PS1 PS2 DISPLAY SHELL HISTFILE HISTFILESIZE Como funciona um Shell? Designadores de expansão de histórico !! History !n !-n !string - !?string - ^string1^string2 - chama o último comando utilizado mostra o histórico de comandos refere-se ao número n do histórico comando atual -n do histórico refere-se ao último comando que começa com a string (expressão) refere-se ao último comando que contenha a string (expressão) repete o último comando substituindo a ocorrência string1 por string2 Como funciona um Shell? Um comando para ser interpretado é dividido em partes distintas: parana@acer:~$ ps -aux | grep bash 1ª parte) comando, o shell identifica se o arquivo existe no PATH e se o usuário possui privilégios suficientes para executá-lo; 2ª parte) identifica por espaços quais são os parâmetros/argumentos. Esses alteram de alguma forma o comportamento durante a execução e/ou saída do comando; 3ª parte) saída (direcionamento/pipe) que permite ao usuário receber o retorno da execução, seja saída padrão ou alguma mensagem de erro/advertência; Como funciona um Shell? Onde encontrar um terminal num sistema GNU/Linux? ● ● ● ● Os consoles são levantados pelo init na inicialização do sistema: /etc/inittab Controlados pelo getty (/sbin/getty) que abre um novo processo para controlar uma porta ttyX (/dev/ttyX) Por padrão /dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4 /dev/tty5 /dev/tty6 são definifos 6 consoles virtuais: CRTL+ALT+1 CRTL+ALT+2 CRTL+ALT+3 CRTL+ALT+4 CRTL+ALT+5 CRTL+ALT+6 Como em todo sistema GNU/Linux é necessário que se realize a autenticação antes de iniciar o uso. Como funciona um Shell? Onde encontrar um terminal num sistema Gráfico? ● ● ● O xterm é um emulador de terminais leve e direto; Comando para instalação no Debian: apt-get install xterm A variável de ambiente $TERM por padrão define xterm como terminal a ser utilizado por diversos sistemas. Como funciona um Shell? gnome-terminal ● ● ● O gnome-terminal é o terminal padrão do Gnome (ambiente de trabalho gerenciado pelo servidor Xorg); Onde encontro? Menu: Aplicações – Acessórios – Terminal A variável de ambiente $COLORTERM define o gnome-terminal como o terminal padrão. Como funciona um Shell? konsole ● ● ● O konsole é o terminal padrão do KDE (ambiente gráfico gerenciado pelo servidor Xorg); Onde encontro? KDE-Menu: Sistemas – Konsole O Konsole permite múltiplas sessões em abas, histórico, impressão e favoritos. Comandos Básicos $ <comando> --help $ free $ man <comando> $ locate $ ls $ find $ cat $ uptime $ cd $ alias $ mkdir $ touch $ rm $ sort $ rmdir $ uniq $ date $ ln $ su $ uname $ du $ wc $ df $ tar $ continua . . . Comandos Básicos $ <comando> --help Mostra os principais paramêtros e forma de uso $ man <comando> Manual on-line do comando -t <manpage> | ps2pdf14 - <arquivo>.pdf $ ls Lista o conteúdo de um diretório -l -la -lh -lha -R $ cat Lista o conteúdo de um arquivo de texto -n -b -T $ cd Alterna entre um diretório e outro Comandos Básicos $ mkdir -p Cria um novo diretório -v -m=600 $ rm Deleta arquivos e diretórios -r -f -rf -i -v $ rmdir Deleta diretórios vazios $ date Mostra e altera a data/hora do sistema +FORMATO %H %M %d %m %Y . . . $ date mesdiahoraminuto[segundo][ano] Comandos Básicos $ su $ du Alterna entre um usuário e outro no sistema -c <comando> -s SHELL Mostra o uso do disco por um arquivo ou diretório -s -h -sh $ df Mostra o status sobre partições em uso, ou da partição onde um determinado arquivo está armazenado. -h -a [arquivo] Comandos Básicos $ free Mostra uso de memória RAM (/proc/meminfo) -b -k -m -g $ locate <string> localiza um arquivo ou diretório (updatedb) Base: /var/cache/locate/locatedb $ find localiza um arquivo ou diretório -name -iname -a -o -size -type -perm -cmin -ctime -mtime -regex -gid -group -printf -exec <comando> {} \; Comandos Básicos $ uptime tempo desde que a maquina iniciou $ alias mostra e cria um “atalho” para um comando/parametros $ touch altera data criação/alteração de um arquivo -c -t -a -m $ sort exibe de forma a ordenar o conteúdo de um arquivo -u -n -r Comandos Básicos $ uniq oculta linhas repetidas $ ln cria links simbólicos e hard links -s $ uname exibe informações sobre o sistema, como a versão do Kernel -r -a $ wc realiza a contagem de linhas, palavras e caracteres -l -c -m -w $ tar empacota arquivos/diretórios em um único arquivo -cvzf -zvxf -cvjf -zvjf -rf -tf Comandos Básicos Exercícios de Fixação 1) De que forma você poderia descobrir em que diretório você está? 2) Qual a diferença entre ( cd / cd .. cd)? 3) Diferencie caminho absoluto e caminho relativo. 4) Qual a seqüência de comando para criar um subdiretório (teste) em /home? 5) Como criar 5 diretórios hierárquicos de uma única vez (Ex. /home/teste/aula/gerds/pos/aula1)? 6) Crie um hard link para arquivo /etc/profile em /tmp/profile. 7) Crie um soft link para o arquivo /etc/resolv.conf em /tmp/dns. 8) Qual a diferença encontrada entre soft link e hard link? Redirecionamento Operador Ação < Redireciona a entrada padrão (STDIN) > Redireciona a saída padrão (STDOUT ) 2> Redireciona a saída de erro (STDERR) >> Redireciona a saída padrão, anexando 2>> Redireciona a saída de erro, anexando | Conecta a saída padrão com a entrada padrão de outro comando 2>&1 Conecta a saída de erro na saída padrão >&2 Conecta a saída padrão na saída de erro >&- Fecha a saída padrão 2>&- Fecha a saída de erro Comandos Básicos Exercício de Fixação 1) Crie um diretório “shell”, dentro dele um novo arquivo “file” e altere a sua data de criação/alteração para 01/01/2010 15:00. 2) Altere a data do sistema para 22/09/1978 ás 10 horas. 3) Crie um alias chamado “kernel” que mostre a versão do Kernel. 4) Informe quantos usuários e grupos estão cadastrados, inclusive usuários e grupos de sistema. 5) Liste todos os usuários do sistema, e suas propriedades, por ordem alfabética de login. 6) Ordene a saída do comando abaixo: $ echo -e "10 \n 4 \n 8 \n 6 \n 0 \n 2" Comandos Básicos Exercício de Fixação 7) Mostre o status de uso das partições dos arquivos /etc/debian_version e /proc/meninfo, explique porque são diferentes se os dois arquivos pertencem a mesma árvore de diretórios? 8) Atualize a base de dados do comando locate em background, depois localize o arquivo “70-persistent-net.rules”. 9) Liste todos os sub-diretórios do diretório /home dentro do arquivo /tmp/HomeDirs.txt 10) Com um único comando liste todos os arquivos do sistema, não listar diretórios, que iniciem com a letra a (A ou a), tenham a extensão .txt, e mostre também o tamanho de cada um deles. Não mostre saídas de erro. Comandos Básicos Exercício de Fixação 11) Execute um único comando que crie cópias backup de todos os arquivos de extensão ".txt" do sistema em um arquivo /tmp/backuptxt.tar; 12) Crie os alias de comando conforme exemplo abaixo: $ data Data do sistema (dd/mm/yyyy): 19/07/2010 $ hora Hora do sistema: 22:15 13) Altere a data de modificação do arquivo /etc/passwd para: Sex Jul 9 10:26:16 BRT 2010 Principais arquivos/diretórios de configuração DEBIAN GNU/LINUX REDHAT $ /etc/inittab $ /etc/hostname $ /etc/passwd $ /etc/shadow $ /etc/group $ /etc/profile $ /etc/skel ~$ .profile ~$ .bashrc ~$ .bash_history ~$ .bash_logout $ /etc/sysconfig/network Principais arquivos/diretórios de configuração DEBIAN GNU/LINUX REDHAT $ /etc/addusers.conf $ /etc/login.defs $ /etc/security/ $ /etc/network/interfaces $ /etc/resolv.conf $ /etc/host.conf $ /etc/hosts $ /etc/rc* $ /etc/inetd.conf $ /etc/crontab $ /etc/cron.* $ /etc/sudoers $ /etc/fstab $ /etc/sysconfig/network-scripts/ifcfg-ethX Principais arquivos/diretórios de configuração $ /etc/issue $ /etc/motd $ /etc/services $ /etc/protocols $ continuar . . . Outros diretórios importantes: /tmp /var/log Principais arquivos/diretórios de configuração Exercício de Fixação 1) Qual o arquivo responsável pela configuração dos servidores de nomes? 2) Identifique na lista de serviços associados as portas TCP/UDP qual é a porta do serviço ldap? 3) Liste a configuração das partições e pontos de montagem utilizados pelo sistema durante a inicialização. 4) Identifique em que datas/horários o sistema executa comandos programados nas “tarefas agendadas”. 5) Se durante o logon dos usuários do sistgema fosse identificado que se está executando um script de forma indevida, ou sem necessidade, quais os arquivos poderiam ser verificados? Principais arquivos/diretórios de configuração Exercício de Fixação 6) Ao alterar o nome da estação, quais arquivos devem ser verificados antes da próxima reinicialização? 7) Se o usuário jose precisar reiniciar as interfaces de rede ou outros serviços, mas não tem acesso de root, como poderia liberar o acesso somente para esse usuário realizar essa tarefa? 8) Ao instalar o serviço telnetd desejamos que esse serviço não seja carregado durante a inicialização, qual o procedimento necessário? 9) Descreva a configuração estática, para Debian, do endereço de rede do host educacao.edu.br 200.120.114.20/24, gateway 200.120.114.254, dns 8.8.8.8: Comandos de rede $ arp $ wget $ dig $ getent $ nslookup $ iftop $ ifconfig $ ssh $ ifup $ scp $ ifdown $ finger $ mii-tool $ links / links2 / lynx $ netstat $ fping $ ntpdate $ nmap $ route $ tcpdmatch $ traceroute Comandos de rede $ arp permite uso da tabela dinânica de endereços da camada 2 -a [unix [kmem ] ] -d hostname -f filename (padrão: /etc/ethers) -s hostname ether address [ temp ] [ pub ] [ trail ] $ dig permite auditorias em um servidor DNS para testar suas configurações -x <dominio> NS <dominio> MX Comandos de rede $ ifconfig <interface> utilitário de configuração das interfaces de rede up | down | <address > netmask <mask> hw ether <mac> | <alias> $ ifup <interface> ativa as interfaces de rede (/etc/network/interfaces) -a $ ifdown <interface> desativa as interfaces de rede -a (/etc/network/interfaces) Comandos de rede $ mii-tool -i <interface> lista o status de conexão nas interfaces -r -w -F (100baseTx-FD | 100baseTx-HD | 10baseT-FD | 10baseT-HD) $ netstat lista o status das conexões, tabelas de roteamento, e estatisticas das interfaces. (Vários arquivos do /proc são lidos) -a -r -M -s # netstat -a | less Conexões Internet Ativas (servidores e estabelecidas) Proto Recv-Q Send-Q Endereço Local tcp 0 0 0.0.0.0:6566 tcp 0 0 127.0.0.1:3306 tcp 0 0 0.0.0.0:22 Endereço Remoto 0.0.0.0:* Estado OUÇA 0.0.0.0:* OUÇA 0.0.0.0:* OUÇA # netstat -r Tabela de Roteamento IP do Kernel Destino 10.15.16.0 default Roteador * 10.15.16.1 MáscaraGen. Opções MSS Janela irtt Iface 255.255.252.0 U 0.0.0.0 UG 00 00 0 eth0 0 eth0 Comandos de rede $ ntpdate ajusta a data e hora via NTP (Network Time Protocol) -q -k -t # ntpdate pool.ntp.org $ route exibe e atualiza a tabela de rotas Add | del | -net | -host | default gw $ tcpdmatch testa as regras para conexões usando tcpwrapper # tcpdmatch telnet [email protected] client: address 10.15.17.255 client: username aluno server: process telnet matched: /etc/hosts.deny line 21 access: denied $ traceroute exibe a rota realizada por um pacote ICMP -i -m -s -w # traceroute 8.8.8.8 Comandos de rede $ wget baixa arquivos por HTTP, HTTPS, and FTP protocols -r -o $ iftop mostra informações sobre o uso da rede, por interface -i -n -F $ ssh acesso remoto Secure Shell (/etc/ssh/ssh_config /etc/ssh/sshd_config) -i -o -p $ scp transfere arquivos via SSH -i -o -P (/etc/ssh/ssh_config /etc/ssh/sshd_config) Comandos de rede Exercícios de Fixação 1) Qual o endereço de hardware (MAC) da interface de rede da sua estação de trabalho? 2) Verifique se a sua interface de rede estabeleceu um link de rede, qual sua velocidade + modo de operação. Altere esse modo para Half Duplex com transferẽncia de 100 mbps sem utilizar autonegociação. 3) Configure sua estação de trabalho para utilizar as seguintes regras de rede: Interface eth0:0 192.168.2.0/24 GW 192.168.2.1 4) Baixe o arquivo http://gerds.utp.br/roberto/linux/linux.doc por linha de comando e transfira uma cópia, por ssh, para a estação 192.168.2.101, utilizando o usuário aluno. 5) Após o exercício 4 identifique o endereço MAC da estação 192.168.2.101 através da sua tabela dinâmica de endereços de hardware. 6) Se eu tiver um servidor apache (porta 80) e quiser saber quantas conexões estão abertas, qual comando poderia auxiliar nessa questão? Comandos de rede Exercícios de Fixação 7) Como verificar se o tcpwappers contém alguma regra que limita o acesso telnet do cliente 10.10.10.10 a sua estação de trabalho? 8) Como verificar se a estação 10.10.10.10 possui a porta de ftp aguardando conexões de rede, se está fechada ou se possui algum filtro? 9) Qual o comando que realiza uma consulta de data/hora de um servidor NTP 200.160.0.8, sem alterar a data/hora do sistema? 10) Identifique na rede 10.10.10.0/24 quantos equipamentos ativos estão respondendo ICMP: 11) Tente mapear a rota, utilizando protocolo ICMP, para se chegar a um dos servidores da página www.google.com.br 12) Ao baixar um arquivo de uma página qualquer identifique qual a maior taxa de transferência atingida. Comandos avançados $ dd $ nohup $ killall $ diff $ pidof $ top $ which $ pstree $ continuar .. $ fsck $ stat $ last $ sync $ lastlog $ watch $ lsof $ dmesg $ lspci $ hwclock $ lsusb $ bg $ mount $ fg $ nice $ jobs $ renice $ kill Comandos avançados $ dd converte e copia arquivos e dispositivos de blocos if=<> of=<> bs=x count=x $ diff permite comparar arquivos linha a linha <file1> <file2> Seu uso comum é a criação de patch e para controle de alterações. $ which informa o caminho absoluto do arquivo de um comando <comando> Obs.: é necessário que o comando esteja no PATH do usuário. Comandos avançados $ fsck verifica e repara sistemas de arquivos GNU/Linux. Pacotes: e2fsprogs dosfstools ntfsprogs xfsprogs reiserfsprogs reiser4progs jfsutils $ last lista os últimos logins realizados (/var/log/wtmp) <usuário> | -n | $ lastlog lista o último login de todos os usuários do sistema -t <dias> -u <usuário> Comandos avançados $ lsof lista os recursos utilizados por um determinado processo -p <pid> | -u <usuario> | … $ lspci lista os dispositivos do barramento PCI -v | -vv $ lsusb lista os dispositivos do barramento USB -v | -d <device> Comandos avançados $ mount lista dispositivos em uso e monta filesystem -a | <dispositivo> | -t <filesystem> | -o <opções> $ nice altera a prioridade padrão (0) ao iniciar um processo -n <prioridade -19 a 20> $ renice altera a prioridade de um processo em execução <prioridade -19 a 20 > <pid> Comandos avançados $ nohup altera a saída padrão de um comando <non-tty>, tornando seu processo independente do terminal (Shell) nohup <comando> nohup: a ignorar a entrada e a acrescentar a saída a `nohup.out' $ pidof procura o número do processo em execução <programa> $ pstree lista a árvore de processos em execução, permitindo visualizar a relação de dependências entre os processos -p Comandos avançados $ stat extrai informações de arquivos e sistemas de arquivos <file> | -f | -t $ sync assegura que os discos estejam sincronizados com o cache $ watch executa um programa periodicamente, atualizando a saída na tela. -n <comando> Comandos avançados $ dmesg exibe a saída da inicialização gerada pelo kernel lendo um buffer utilizado pelo kernel para enviar mensagens de eventos $ hwclock exibe e altera a data/hora da máquina # hwclock --set --date="09/22/1978 10:30" -w ou --systohc : para copiar a hora do sistema para o relógio da máquina. -s ou --hctosys : para copiar a hora da máquina para a hora do sistema. -r ou –show $ bg lista e envia processos em segundo plano. <pid> Comandos avançados $ fg lista e envia processos em primeiro plano (ou plano de frente). <pid> $ jobs lista os processos em segundo plano ou parados (STOP) jobs $ kill envia sinais para os processos - <sinal> <pid> -l (lista todos os sinais possíveis de serem enviados) Comandos avançados $ killall envia sinais para os processos com um determinado nome <nome> -u <user> | -g <group> $ top lista os processos por ordem de consumo de recursos -u <user> -p <pid's> Comandos avançados Exercícios de fixação 1) Identifique os seguintes componentes da sua estação de trabalho: Processador, placa de vídeo, placa de rede e placa de som. 2) Inicie o Broffice Writer, por linha de comando, com prioridade 15. Depois altere essa prioridade para -5. Demonstre esse processo com alguma ferramenta que permita verificar essa alteração. 3) Inicie um processo com o comando sleep (200 segundos) , faça a seguinte sequência de comandos: a) pare a execução do comando após ter iniciado: b) liste os processos parados: c) reinicie o comando em segundo plano: d) finalize o processo enviando um sinal SIGKILL para ele: 4) Identifique se na inicialização foi encontrada uma interface de rede (eth0,1), caso positivo verifique se o link de rede está “up”. Comandos avançados Exercícios de fixação 5) Liste todos os recursos de memória (arquivos/bibliotecas carregadas) utilizados durante a execução do evince (se for necessário instale); 6) Liste informações detalhadas sobre os seguintes arquivos e seus sistemas de arquivos: /etc/passwd, /dev/cdrom, /proc/cpuinfo 7) Crie um arquivo com 200 MB, formate com o sistema de arquivos xfs. Faça a montagem no ponto /mnt e com opção de escrita, copie alguns arquivos nele, desmonte. Realize uma checagem para verificar sua integridade. 8) Como criar um backup com o comando tar de todos os arquivos do diretório /home, encerrar o terminal e garantir que o comando continue sendo executado? 9) Como descobrir qual o caminho absoluto para o comando locate? 10) Indique uma forma de sabermos se um pendrive foi reconhecido no barramento USB. Tipos de variáveis e atribuição Não é necessário declarar uma variável em Shell Script, na atribuição não deve-se utilizar espaços e uma variável pode receber vários tipos de dados. $ valor=1 $ string=”expressão $USER” # reconhece o caracter especial $ $ string='expressão $USER' # não reconhece caracteres especiais $ string=$”expressão” # reconhece \t \n \a, etc... $ kernel=`uname -r` $ kernel=$(uname -r) $ soma=$((5+8)) Tipos de variáveis e atribuição Exemplos: $ nome=Chico $ idade=6 $ echo O $nome tem $idade anos. O Chico tem 6 anos. $ joana=30 $ beth=50 $ echo A soma das idades de Beth e Joana é de $(($joana+$beth)) anos. A soma das idades de Beth e Joana é de 80 anos. Tipos de variáveis e atribuição Exemplos: #Efetua um cálculo matemático simples. echo -e “2 x 3 = $((2*3))” echo -e “(5 + 3)/2 = $(((5+3)/2))” echo -e “4 - 2 = $((4-2))” Tipos de variáveis e atribuição Exemplos: # Lista de Usuários USERLIST=`cat /etc/passwd | awk -F: '{print $1}'` echo $USERLIST 1) Levando em consideração o exemplo abaixo, complete as demais variáveis: IP=$(/sbin/ifconfig eth0 | grep "inet end" | awk -F" " '{print $3}') MASK= MAC= GW= Tipos de variáveis e atribuição Atribuindo valor a uma variável com o comando read: $ read -p “Informe seu nome:” NOME Maria $ echo $NOME Maria Recebendo a informação de uma forma elegante: Dialog nome=$( /usr/bin/dialog --stdout --inputbox 'Digite seu nome:' 0 0 ) echo "O seu nome é: $nome" Tipos de variáveis e atribuição Recebendo a informação de uma forma elegante: Dialog export DIALOG=$(which dialog) # Entrada de dados NOME=$( $DIALOG --stdout --inputbox 'Digite seu nome:' 0 0 ) echo "O seu nome é: $NOME" # Confirmação $DIALOG --yesno 'Deseja continuar?' 0 0 echo "$?" # Mensagem de aviso $DIALOG --title "Aviso" --msgbox “Não faça isso!” 0 0 # Menu OPC=$(dialog --stdout --menu "Selecione uma opção: " 0 0 5 1 "Pera" 2 "Uva" 3 "Maçã" 4 "Abacaxi" 5 "Abacate") echo $OPC Tipos de variáveis e atribuição Recebendo a informação de uma forma elegante: Zenity export ZENITY=$(which zenity) # Entrada de dados NOME=$($ZENITY --entry --title "NOME" --text "Digite seu nome: ") echo "O seu nome é: $NOME" # Confirmação $ZENITY --question --title "YES / NO" --text "Tem certeza?" echo "$?" # Mensagem de aviso $ZENITY --info --title "CUIDADO" --text "FUJA. ESSA MULHER TEM DONO." $ZENITY --notification --title "FUJA" --text "Cuidado. Essa mulher tem dono." # Menu OPC="$(zenity --list --column "Selecione uma opção: " --title="FRUTAS" "Abacaxi" "Banana" "Morango" "Uva" "Sair")" echo $OPC Tipos de variáveis e atribuição Expansão de Strings ${#var} - Retorna o tamanho da string eval $var - Executa o conteúdo de $var ${!texto*} - Retorna os nomes de variáveis começadas por 'texto' ${var:N:tam} - Retorna 'tam' caracteres à partir da posição 'N' ${var#texto} - Corta 'texto' do início da string ${var%texto} - Corta 'texto' do final da string. Tipos de variáveis e atribuição SubString $ SUBSTR=”meusapato” $ echo ${SUBSTR:$[3]} sapato $ echo ${SUBSTR:$[-6]} sapato $ echo ${SUBSTR:$[0]:$[3]} meu Tipos de variáveis e atribuição $ SUBSTR=”Meu sapato velho. Meu sapato novo.” Substituição de Strings $ echo ${SUBSTR/sapato/carro} #Substitui uma vez Meu carro velho. Meu sapato novo. $ echo ${SUBSTR//sapato/carro} #Substitui todas as ocorrências Meu carro velho. Meu carro novo. O bom e velho sed $ echo $SUBSTR | sed "s/sapato/carro/" $ echo $SUBSTR | sed "s/sapato/carro/g" #Substitui uma vez #Substitui todas Tipos de variáveis e atribuição Array em Bash Quando devo usar? Devemos usar arrays nas seguintes situações: 1. Quando lidamos com muitos dados do mesmo tipo. 2. Quando esses dados são correlacionados. 3. Quando precisamos trabalhar com esses dados em loops. 4. Quando precisamos de índices para trabalhar nos dados. 5. Quando queremos evitar a fadiga. 6. Encontrar coisas rapidamente. Exemplo de uso: em lista de cidades, lista de alunos, lista de itens... Tipos de variáveis e atribuição Array em Bash 1) Iniciando um array: $ array=(valor1 valor2 valor3) 2) Vamos a segunda maneira de se criar um array: $ array2[0]='valor1' $ array2[1]='valor2' $ array2[2]='valor3' Obs.: Acima temos um array com três valores, internamente o shell armazena essa estrutura dessa maneira: $ array=([0]="valor1" [1]="valor2" [2]="valor3") Tipos de variáveis e atribuição Array em Bash 3) Listar todos os elementos de um array: $ echo ${array[*]} 4) Contar os elementos de um array: $ echo ${#array[*]} 5) Contar tamanho de um elemento do array: $ echo ${#array[<valor>]} 6) Eliminar um elemento do array: $ unset array[valor] 7) Eliminar um array: $ unset array Tipos de variáveis e atribuição Array - Exemplo de uso $ LISTA=("Curitiba" "São Paulo" "Rio de Janeiro" "Florianópolis" "Porto Alegre") $ echo ${LISTA[3]} Florianópolis $ echo ${LISTA[1]} São Paulo Observe que a lista inicia-se pela posição zero: 0 Curitiba 1 São Paulo 2 Rio de Janeiro ... Variáveis de Ambiente LANG = Codificação do terminal e linguagem padrão HOME = Diretório home do usuário logado USER / USERNAME = Nome do usuário logado PWD = Diretório corrente PATH = Caminhos pelos quais o shell procurará os comandos que você tentar executar HOSTNAME = Nome da estação de trabalho http_proxy = Proxy da rede para conexões externas ? = Valor de retorno do ultimo comando executado Variáveis de Ambiente PS1 = Formata o prompt padrão RANDOM = Fornece um número inteiro de forma aleatória DISPLAY = Id do display utilizado pelo servidor X na corrente sessão HISTFILE = Arquivo que irá armazenar o histórico dos comandos HISTFILESIZE = Tamanho máximo do arquivo com histórico … Dica para ver todas as váriaveis: $ echo $<tab> Trabalhando com arquivos de texto Shell é o ambiente. Um Shell Script é formado por um conjunto de comandos que serão executados a partir de um arquivo de texto. Para facilitar o entendimento sobre Shell Script teremos que analisar vários fatores que irão contribuir para sua correta execução: 1) FHS – Arquivos e diretórios 2) Sistema de permissões 3) Filtros de texto 4) Editores de texto 5) Comandos básicos do Shell Trabalhando com arquivos de texto FHS – Arquivos e diretórios http://www.pathname.com/fhs/ Trabalhando com arquivos de texto FHS – Arquivos e diretórios http://www.pathname.com/fhs/ / – É na raiz que ficam todos os diretórios do GNU/Linux; /bin – Contém os comandos essenciais para o funcionamento do sistema; /boot – Arquivos necessários à inicialização do sistemae os arquivos do gerenciador de boot; /dev – Armazena todos os arquivos-dispositivos, chamados de nós de dispositivos; /etc – Arquivos de configuração do sistema da máquina local; /lib – Biblilotecas compartilhadas e módulos do kernel; /media – Ponto de montagem para mídias removíveis; /mnt – Diretório usado como ponto de montagem de sistema de arquivos; /opt – Normalmente, é utilizado por programas que foram instalados com o sistema já em funcionamento, e precisam de um espaço maior para serem armazenados (ex. OpenOffice); /var – Contém arquivos de dados variáveis; /sbin – Comandos utilizados para inicializar, reparar, restaurar e/ou recuperar o sistema; /tmp – Utilizado para armazenar arquivos temporários; Trabalhando com arquivos de texto FHS – Arquivos e diretórios http://www.pathname.com/fhs/ /usr - Armazena dados compartilhados, somente-leitura; /home – É o diretório que mantém os dados dos usuários; /root – Diretório pessoal do adminsitrador (root) do sistema; /proc – Diretório virtual, mantido pelo kernel onde encontramos a configuração atual do sistema; Trabalhando com arquivos de texto Sistema de permissões Tipos de permissões Trabalhando com arquivos de texto Sistema de permissões Tipos de permissões aluno@gerds123:~/curso$ ls l total 29604 rwrr 1 aluno cstr 2007101 Jan 5 10:58 CursoGnome.pdf drwxrwxrwx 5 aluno cstr 44 Jan 12 14:46 DebianDesktop rwxrxrx 1 aluno cstr 5591278 Jan 12 15:24 Desktop.sh rw 1 aluno cstr 1314131 Jan 4 09:12 Expresso.pdf drwxrwxrwx 3 aluno cstr 19 Jan 12 14:46 Pessoa rwrr 1 aluno cstr 6811510 Jan 13 10:50 SL2.odp rwrr 1 aluno cstr 6264237 Jan 12 16:01 SL.odp drwxrwxrwx 3 aluno cstr 17 Jan 12 14:46 Totais Trabalhando com arquivos de texto Sistema de permissões SUID Permissões especiais Se este bit estiver ligado em um arquivo executável, isso indica que que ele vai rodar com as permissões do seu dono (o proprietário do arquivo) e não com as permissões do usuário que o executou. OBS: Só tem efeito em arquivos executáveis. SGUID Faz o mesmo que o SUID, mas agora o arquivo executado vai rodar com as permissões do grupo do arquivo. Se aplicado a um diretório, força os arquivos/diretórios criados dentro dele a ter o mesmo grupo do diretório pai, ao invés do grupo primário do usuário que o criou. STICKY Se este bit for ativado, faz com que arquivos criados em um determinado diretório só possam ser apagados por quem o criou (dono) ou pelo super-usuário do sistema. Um exemplo de uso do STICKY é o diretório /tmp. Trabalhando com arquivos de texto Sistema de permissões Utilitários # chmod Sintaxe: chmod <permissões> <arquivo/diretório> Muda as permissões de um arquivo ou diretório. Existem várias formas de se alterar as permissões, escolha a que mais lhe agrada. # chown Sintaxe: chown <usuário> <arquivo/diretório> OU Sintaxe: chown <usuário>.grupo <arquivo/diretório> O comando chown permite que se altere o usuário proprietário de um arquivo ou diretório. Possui a possibilidade de alterar o grupo junto ao proprietário. # chgrp Sintaxe: chgrp <grupo> <arquivo/diretório> Muda o grupo do qual um arquivo ou diretório faz parte. Trabalhando com arquivos de texto Sistema de permissões Utilitários # umask Sintaxe: umask <valor> Define uma máscara de permissão pela qual os novos arquivos e diretórios serão criados. Trabalhando com arquivos de texto Exercicios de Fixação 1) Foi determinado que os usuários comuns (não root) não deverão executar o comando df. Como retirar a permissão do comando df para que esses usuários não possam executá-lo? 2) Altere o grupo do arquivo /var/log/lpr.log para lpadmin para que os usuários desse grupo possam ler este arquivo. 3) Como fazer para que um diretório compartilhado pelo samba crie arquivos fazendo com que ele mantenha as permissões para o grupo de usuários, ou seja, a pessoa (com autorização) que executar o arquivo (acessar o diretório), o fará com se fosse membro do grupo a qual pertence o arquivo. 4) Como definir que um determinado arquivo tenhas as seguintes permissões: Dono: Ler, Gravar e Executar Grupo: Ler e Gravar Outros: Ler 5) Qual o diretório que mantêm informações do sistema que podem variar durante o uso dos recursos (daeom, logs, etc...)? 6) Qual diretório que mantém pontos dinâmicos de montagem de mídias removiveis? Trabalhando com arquivos de texto Filtros de Texto O Linux possui diversas ferramentas para trabalhar e transformar arquivos texto, puros sem formatação especial. Estas ferramentas são úteis quando estamos trabalhando com Scripts, Arquivos de Configuração, Arquivos de Log, etc. Trabalhando com arquivos de texto Filtros de Texto cat - concatenar arquivos, ou entrada padrão, para a saída padrão. # cat teste1.txt # cat teste1.txt teste2.txt > teste # cat teste3.txt >> teste # cat < texto.txt # cat texto.txt | wc -l Trabalhando com arquivos de texto Filtros de Texto cut - Lê o conteúdo de um ou mais arquivos e tem como saída uma coluna vertical Opções -b numero - Imprime o byte número -c número - Imprime o caractere número -d delimitador - Delimitador que separa as colunas -f número - Imprime a coluna número Trabalhando com arquivos de texto Filtros de Texto Exemplos de uso do comando cut: # ifconfig eth0 | grep 'inet ' | cut -d ':' -f 2 | cut -d ' ' -f 2 # ls -la | cut -c 47-70 # $cut –d : -f 1 /etc/passwd # cat /etc/hosts | cut –f 2 Trabalhando com arquivos de texto Filtros de Texto expand - Troca a tabulação dentro dos textos pelo número de espaços. Deixa o texto mais fácil sua leitura. Opções: -t número - especifica o número de espaço para o tab. -i - Converte somente no início das linhas Exemplo de uso: $ cat LEIAME.TXT aaaa a a a a $ expand -t 1 LEIAME.TXT aaaa aaaa Trabalhando com arquivos de texto Filtros de Texto fmt - Formata um texto com uma largura específica. Pode remover ou adicionar espaços. Opções: -w número - Configura a largura desejada para o texto $ fmt –w 50 texto.txt Trabalhando com arquivos de texto Filtros de Texto grep - Procura por linhas/palavras em um arquivo que satisfaça um determinado padrão de busca. Opções: -i ignora maiúscula e minúscula -c contar quantas coincidências -l não mostra a linha encontrada -v Mostra as linhas não coincidentes -n Mostra a linha dentro do arquivo Trabalhando com arquivos de texto Filtros de Texto Exemplos de uso do grep $ grep aluno /etc/passwd (Forma não elegante: # cat /etc/passwd | grep aluno) $ grep aluno /etc/passwd |cut –d : -f 5 $ grep eth0 /proc/net/dev $ ifconfig eth0 | grep packets Trabalhando com arquivos de texto Filtros de Texto head - Mostra as primeiras 10 linhas do início de um texto, ou um número de linhas definido pelo usuário. Opções: -n número Configura o número de linhas a ser mostrada $ head –n 20 /etc/passwd Trabalhando com arquivos de texto Filtros de Texto tail - Mostra as últimas 10 linhas do fim de um texto, ou um número de linhas definido pelo usuário. Opções: -n número Configura o número de linhas a ser mostrada $ tail –n 20 /etc/passwd Trabalhando com arquivos de texto Filtros de Texto join - Unes a linhas de ambos os arquivos que tenham um índice comum. Usado para criar um banco de dados simples. Opções: -j1 número - Escolhe o campo número como índice para o arquivo1 -j2 número - Escolhe o campo número como índice para o arquivo2 -j número -j1 número - Escolhe o campo número como índice para ambos arquivos Trabalhando com arquivos de texto Filtros de Texto Exemplo de uso do comando join Supondo um arquivo com: 1. GZH-1234 2. HYD-2389 Outro arquivo com: 1. Fiat Uno Mille 2. Audi A3 $ join –j 1 arquivo1 arquivo2 1. GZH-1234 Fiat Uno Mille 2. HYD-2389 Audi A3 Trabalhando com arquivos de texto O poderoso SED O utilitário “sed” é um editor de streams. Um programa desta natureza, é usado para realizar transformações num arquivo de texto ou num pipe (fluxo de dados). Sed é bastante útil para fazer trocas de letras, palavras ou linhas inteiras de texto. É uma ferramenta largamente utilizada em scripts shell. sed [opções] [script] [arquivo/pipe] Trabalhando com arquivos de texto O poderoso SED – exemplos de uso: $ sed “n” teste.txt Imprime o conteúdo do arquivo “teste.txt” na saída padrão (monitor). $ sed -n “2,4p” teste.txt Imprime da segunda à quarta linha do arquivo “teste.txt” na saída padrão (monitor). $ sed “s/zé/marcius/” teste.txt Substituí a primeira ocorrência da string “zé” de cada linha por “marcius”, presente no arquivo “teste.txt”. Trabalhando com arquivos de texto O poderoso SED – exemplos de uso: $ sed -e “2q” -e “s/zé/marcius/” teste.txt Processa o arquivo “teste.txt” até o inicio da segunda linha, substituindo a primeira ocorrência da string “zé” por “marcius”. $sed “s/zé/marcius/2” teste.txt Substituí a segunda ocorrência da string “zé” de cada linha, pela string “marcius”, presente no arquivo “teste.txt”. $sed “/^$/d” teste.txt Apaga as linhas em branco do arquivo “teste.txt”. Trabalhando com arquivos de texto O poderoso SED – exemplos de uso: $ sed “/zé/d” teste.txt Apaga as linhas que contenham a string “zé” do arquivo “teste.txt”. $sed -i “s/samba/rede/” teste.txt Substituí a primeira ocorrência da string “samba” de cada linha por “rede”, e grava esta alteração no arquivo “teste.txt”. $ sed “/CPPC/Id” teste.txt > teste_modificado.txt Apaga todas as linhas que contenham a string “CPPC”, independentemente de maiúsculas e minúsculas, gravando o resultado no arquivo “teste_modificado.txt”. Trabalhando com arquivos de texto Exercícios de Fixação 1) Liste as linhas do arquivo /etc/group em que o usuário aluno esteja presente. 2) Liste todos os usuários do sistema, apresentando na saída do comando apenas o nome do usuário e seu respectivo UID. 3) Liste apenas as linhas do /etc/passwd com usuários que iniciem com “a”. 4) Liste apenas as 5 últimas linhas do arquivo /etc/passwd que terminem com a expressão “/bin/sh”. 5) Altere a saída do comando lspci para apresentar a seguinte saída para placas de vídeo, som e rede: # lspci | <xxx | xxx | xxx> 00:14.2 Placa de som: ATI Technologies Inc SBx00 Azalia (Intel HDA) 01:05.0 Placa de Vídeo: ATI Technologies Inc RS690 [Radeon X1200 Series] 02:00.0 Placa de rede: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E Trabalhando com arquivos de texto Editores de texto cat nano gedit oowriter Continuar... Editor escolhido: Vim - Visual Interface Improved Para obter mais informações sobre VIM consulte: http://aurelio.net/vim/vim-basico.txt Trabalhando com arquivos de texto Editores de texto - VIM Trabalhando com arquivos de texto Editores de texto – Executando o VIM $ vim => Abre o vim vazio, sem nenhum arquivo e exibe a tela de apresentação. $ vim arquivo => Abre o arquivo de nome "arquivo". $ vim arquivo + => Abre o arquivo de nome "arquivo", com o cursor no final do mesmo. $ vim arquivo +10 => Abre o arquivo de nome "arquivo", com o cursor na linha 10. $ vim arquivo +/Copag => Abre o arquivo de nome "arquivo", na primeira ocorrência da palavra "Copag". Trabalhando com arquivos de texto Editores de texto - VIM No vim temos vários "modos", que são estados do editor. São eles: Modo Tecla Rodapé Descrição de Inserção i INSERT Inserção de texto de Comandos <ESC> Comandos de manipulação de texto Linha de comando : : Comandos de manipulação arquivo Visual v VISUAL Seleção visual de texto Busca / / Busca de padrões no texto Reposição R REPLACE Inserção sobreescrevendo Trabalhando com arquivos de texto Editores de texto – VIM – Modo de comando :w => Salva o arquivo que está sendo editado no momento. :q => Sai. :wq => Salva e sai. :x => Idem. ZZ => Idem. :w! => Salva forçado. :q! => Sai forçado. :wq! => Salva e sai forçado. Trabalhando com arquivos de texto Editores de texto – VIM – Modo Visual Entre no modo visual: v Agora, utilize as teclas direcionais (setas) do teclado, para selecionar o texto desejado. Pressione e cole, utilizando a tecla "p" (paste). Veja agora como apagar um determinado texto: Utilizando normalmente as teclas Backspace/Delete, ou entrando em modo visual (v) e pressionando a tecla Delete. Você pode remover até o final de uma palavra, utilizando: dw Pode também remover até o final de uma frase: d$ Trabalhando com arquivos de texto Criando o primeiro arquivo de Shell Script $ vim helloword.sh #!/bin/bash VAR=“Hello Word!” echo $VAR $ chmod +x helloword.sh $ ./helloword.sh Hello Word! $bash +xv helloword.sh # Execução em modo de debug. Trabalhando com arquivos de texto Exercícios de Fixação Crie um shell script com a seguinte saída: Descrição do sistema Sistema operacional: $OS Processador: $CPU Clock da CPU: $CLOCK Memória da Máquina: $MEM Placa de vídeo: $VGA Placa de Rede: $NET Placa de Som: $SOUND Esta máquina já está no ar: $UPTIME Trabalhando com arquivos de texto Exercícios de Fixação Faça um script que liste todos os executáveis que estão no seu PATH, ordene a saída, e grave em um arquivo chamado executaveis.txt. Não deixe aparecer nenhuma mensagem de erro. Variáveis especiais Variável Parâmetros Posicionais $0 Parâmetro número 0 (nome do comando ou função) $1 Parâmetro número 1 (da linha de comando ou função) ... $9 ${10} ... Parâmetro número N ... Parâmetro número 9 (da linha de comando ou função) Parâmetro número 10 (da linha de comando ou função) Parâmetro número NN … $# Número total de parâmetros da linha de comando ou função $* Todos os parâmetros, como uma string única $@ Todos os parâmetros, como várias strings protegidas $$ Número PID do proc esso atual (do próprio script) $? Código de retorno do último comando executado Operadores do Shell Operadores Aritméticos Operadores Relacionais + Adição == Igual - Subtração != Diferente * Multiplicação > Maior / Divisão >= Maior ou Igual % Módulo < Menor ** Exponenciação <= Menor ou Igual Operadores do Shell Operadores de Atribuição = Atribui valor a uma variável += Incrementa a variável por uma constante -= Decrementa a variável por uma constante *= Multiplica a variável por uma constante /= Divide a variável por uma constante %= Resto da divisão por uma constante ++ Incrementa em 1 o valor da variável – Decrementa em 1 o valor da variável Operadores do Shell Operadores Lógicos Operadores de BIT && E lógico (AND) || == Igual OU lógico (OR) != Diferente * Multiplicação > Maior / Divisão >= Maior ou Igual % Módulo < Menor ** Exponenciação <= Menor ou Igual Estrutura de decisão if TESTE then comandos elif TESTE comandos else comandos fi Caso o comando seja executado com sucesso serão executados os comandos do bloco then. Estrutura de decisão if [ $opc -eq 1 ] then inclusao elif [ $opc -eq 2 ] then alteracao elif [ $opc -eq 3 ] then exclusao elif [ $opc -eq 4 ] then exit else echo “Digite uma opção entre 1 e 4.” fi Estrutura de decisão Podemos associar a estrutura de decisão com as opções do comando test: OPERAÇÃO COM ARQUIVOS: -e arq verifica se o arquivo existe -s arq verifica se o arquivo existe e tem tamanho maior que zero -f arq verifica se ele é um arquivo -d dir verificar se ele é um diretório -z arq verifica se o arquivo existe e tem tamanho zero -r arq quero saber se o usuário que esta executando o shell script pode ler o arquivo -w arq quero saber se pode alterar o arquivo -x arq quero saber se ele consegue executar o arquivo ... ver $ man teste Estrutura de decisão Podemos associar a estrutura de decisão com as opções do comando test: OPERAÇÃO COM STRING -n string se é maior que zero -z string se igual a zero OPERAÇÃO COM INTEIROS n1 -eq n2 – igual n1 -gt n2 – maior n1 -lt n2 – menor ... Ver $man test Estrutura de decisão Exercícios utilizando a estrutura de decisão (if): 1) Crie um shell script que receba dois números inteiros (entre 0 e 100) e informe se o primeiro é maior, menor ou igual ao segundo; 2) Escreva um script que receba um arquivo por parâmetro, com caminho absoluto, e informe se o arquivo existe, se tem tamanho maior que zero e se for um diretório liste seu conteúdo; 3) Crie um programa que recebe um comando simples, por parâmetro, verifique se ele realmente existe no sistema (informando sua ausência) e informe o caminho absoluto do seu binário. No final pergunte ao usuário se ele deseja ver o manual on-line do comando recebido. (considere um comando válido os comandos encontrados pelo utilitário which) Estrutura de decisão É uma estrutura de decisão, ainda mais sofisticada que “if”. A seguir, a sintaxe de utilização: case VARIÁVEL in VALOR1) comandos;; VALOR2) comandos;; VALOR3) comandos;; *) comandos;; esac Estrutura de decisão HORA=`date +%H` case $HORA in 0?|1[01]) echo "Bom dia!" ;; 1[2-8]) echo "Boa tarde!" ;; 19|2?) echo "Boa noite!";; *) echo "Erro ao solicitar a hora esac Estrutura de decisão Exercícios utilizando a estrutura de decisão (case): 1) Crie um shell script que limpe a tela, forme um menu solicitando a idade do usuário, e exiba as seguintes informações de acordo com a idade informada: 1-13 Você é uma Criança, vá brincar. 14-17 Adolecente, vá estudar. 18-60 Adulto, vá trabalhar. 61-99 Apto para o clube da melhor idade! Qualquer outro valor: “Idade inválida!” Laços # lista os nomes a partir de uma lista criada em uma variável nome="joao francisco decio" for i in $nome do echo $i sleep 1 done # lista as linhas de um arquivo, aguardando 1 segundo entre uma linha e outra for i in `cat arquivo` do echo $i sleep 1 done Laços # lista o conteúdo do diretório atual for i in * # o caracter "*" irá trazer o conteudo do diretório corrente do echo $i sleep 1 done # Lista números de 1 a 100, aguardando 1 segundo entre um número e outro. for i in $(seq 1 100) do echo $i sleep 1 done Laços # Lista números de 1 a 9 for ((i=1; i<=9; i++)) do echo -n “$i “ done # Lista o conteúdo de um array array=(1 2 3 4 5 6 7 8 9 10) for i in ${array[*]} do i=$[i-1] echo ${array[$i]} done Laços Exercícios de Fixação utilizando a estrutura de repetição (for): 1) Verifique no sistema quantos usuários existem, quantos são usuários de sistema (UID abaixo de 1000) e quantos são usuários criados para uso (UID igual ou acima de 1000). Informe quantos usuários utilizam o bash como shell, quantos utilizam sh e quantos estão bloqueados para uso com shell (/bin/false). 2) A partir de um diretório, passado por parâmetro, escrever um script que renomeia todos os arquivos de uma determinada extensão (parâmetro) para outra extensão. Exemplo: Todos os arquivos .doc do diretório /tmp alterados para .txt $ ./renomeia.sh /tmp doc txt Laços # Repete a informação enquanto a variável $inicio seja menor que a variável $fim inicio=1 fim=10 while [ $inicio -lt $fim ] do echo "Valor inicial é menor que o final: $inicio $fim" inicio=$((inicio+1)) done echo "Valor inicial é igual ao valor final: $inicio $fim" Laços # Lê o conteúdo de um arquivo, linha a linha, até o final. arq=$1 i=0 echo " ------------- Inicio do arquivo. ------------- " cat $arq | while read LINE do i=$((i+1)) echo “Linha $i: $LINE” done echo " ------------- Final do arquivo. ------------- " Laços # Repete o bloco de comandos enquanto a condição não é satisfeita # Ou sejam enquanto o usuário cabrito não se logar no sistema o laço não será # desfeito. until who | grep cabrito do clear echo "Usuario cabrito nao se logou no sistema" sleep 2 done date "+ O usuario cabrito logou-se no sistema em %d/%m/%Y as %H:%M". Laços Exercícios utilizando a estrutura de repetição (while/until): 1) Crie um shell script que monitore o tamanho de um diretório, e passar dos 10 MB o script irá enviar um aviso de LOG para o sistema para que o administrador receba o alerta da hora/minuto que isso ocorreu. 2) Escreva um script que monitore o tamanho de um arquivo, se o arquivo tiver um tamanho superior a 50 linhas o script irá enviar um aviso de LOG para o sistema para que o administrador receba o alerta da hora/minuto que isso ocorreu. Funções Funções são aglomerados de comandos que podem ser definidos para uso posterior em qualquer parte do código. Praticamente todas as linguagens usam funções que ajudam a organizar o código. Vejamos a sintaxe de uma função: nome_da_funcao() { comandos } O corpo das funções devem construídos sempre antes de serem utilizados, caso contrário, o sistema retornará um erro do tipo “command not found”, que significa que a função em questão não pode ser encontrada. Funções function entrada(){ read -p "Valor inicial: " inicio read -p "Valor final: " fim } entrada while [ $inicio -ge $fim ] do echo "Valor inicial eh maior que o final." entrada done for i in $(seq $inicio $fim) do echo "$i" done Expressões Regulares “Expressão regular é um método formal de se especificar um padrão de texto” O uso de expressões regulares torna mais rápida a procura pela informação desejada, quanto mais refinada for a sua construção, mais preciso e rápido será o resultado. Expressões Regulares O que podemos validar com uma expressão regular? ● Data ● Horário ● Endereço IP ● Endereço de email ● Endereço de Internet ● Número de Telefone, RG, CPF, cartão de crédito . . . ● Dados que estejam no começo ou no final da linha. Expressões Regulares Metacaracteres .?*+^|[]{}()\ . - [....] - Um caracter qualquer Lista de caracteres permitidos [^...] - Lista de caracteres não permitidos ? - Zero ou um caracter * - Zero, um ou mais caracteres + - Um ou mais {n,m} – De n até m ^ - Início da linha $ Fim da linha - Expressões Regulares Metacaracteres .?*+^|[]{}()\ \b - Início ou fim de uma palavra \c - Torna literal o caractere c | Ou um ou outro - (…) - Delimita um grupo \1...\9 – Texto casado com os grupos 1...9 Expressões Regulares Exemplos de uso de lista n[ãa]o não, nao [Tt]eclado teclado, Teclado e[xs]tendido estendido, extendido 12[:. ]45 12:45, 12.45, 12 45 Exemplos de uso de lista n[ãa]o não, nao [Tt]eclado teclado, Teclado e[xs]tendido estendido, extendido 12[:. ]45 12:45, 12.45, 12 45 Expressões Regulares Classes POSIX Posix é um padrão internacional que define classes de caracteres. Exemplos de uso: Classe POSIX Significado [:upper:] Letras maiúsculas [AZ] [:lower:] Letras minúsculas [az] [:alpha:] Letras maiúsculas/minúsculas [AZaz] [:alnum:] Letras Letras e Números [AZaz09] [:digit:] Números [09] [:blank:] Espaço e TAB [ \t] . . . Expressões Regulares Exemplo de uso de uma expressão regular #!/bin/bash a=10 # zerando a contagem while [ $a lt 350 ] # limitando a amostragem ate 350 do echo $a | egrep x '((1[09]|[19]?)[09]|2([04][09]|5[05]))' a=$((a+1)) # incrementan a contagem done Neste exemplo a variável $a recebe números de 10 a 349, mas somente mostra na tela valores de 0 a 255. Números típicos usados em um endereço IP. Expressões Regulares Exercício de fixação Com base no exemplo dado escreva um shell script que receba um endereço IP e informe se é um endereço válido ou não. $ ValidaIP.sh 10.10.10.102 Endereço IP 10.10.10.102 é um endereço Ipv4 válido. $ ValidaIP.sh 10.10.10.266 O endereço 10.10.10.266 não é um endereço Ipv4 válido. Expressões Regulares Classes POSIX Posix é um padrão internacional que define classes de caracteres. Exemplos de uso: Classe POSIX Significado [:upper:] Letras maiúsculas [AZ] [:lower:] Letras minúsculas [az] [:alpha:] Letras maiúsculas/minúsculas [AZaz] [:alnum:] Letras Letras e Números [AZaz09] [:digit:] Números [09] [:blank:] Espaço e TAB [ \t] . . . Shell Script – Exercícios de Fixação Estudo dirigido Com base nos conhecimentos apresentados e a fim de fixar é proposto uma lista de exercícios a ser entregue até o dia da prova. Poderão ser aproveitadas as aulas restantes. Esta lista terá peso 3.0 para avaliação do bimestre. Para obtenção da nota total todos os exercícios deverão estar completos, sem erros de execução, e seus códigos copiados para um trabalho impresso entregue em mãos. Referências [ 1 ] JARGAS, Aurélio Marinho. Expressões regulares: uma abordagem divertida. São Paulo: Novatec Editora, 2008. 2a ed. rev. e ampl. [ 2 ] NEVES, Júlio César. Curso de Shell Script - Papo de Botequim. Revista Linux Magazine. Edição 11. Agosto 2005. [ 3 ] PRITCHARD; PESSANHA; STANGER; DEAN; LANGFELDT. Certificação Linux LPI. Alta Books. 2007. [ 4 ] RIBEIRO, Uirá. Certificação Linux. Axcel Books. 2004. Atribuição-Compartilhamento pela mesma licença 2.5 (http://creativecommons.org/licenses/by-sa/2.5/deed.pt) Você pode: copiar, distribuir, exibir e executar a obra ● criar obras derivadas ● fazer uso comercial da obra Sob as seguintes condições: Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. ● Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. ● Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor. Qualquer direito de uso legítimo (ou "fair use") concedido por lei, ou qualquer outro direito protegido pela legislação local, não são em hipótese alguma afetados pelo disposto acima. Este é um sumário para leigos da Licença Jurídica (na íntegra: http://creativecommons.org/licenses/by-sa/2.5/br/legalcode). Termo de exoneração de responsabilidade: http://creativecommons.org/licenses/disclaimer-popup?lang=pt ●