Computadores e Sociedade Software Livre GNU/Linux parte2 Prof. Jefer - [email protected] people.ufpr.br/~jefer Prof. Jefer Benedett Dörr www.profjefer.wordpress.com [email protected] ● Coordenador do curso de Licenciatura em Computação - UFPR Setor Palotina ● Mestre em Informática - UFPR ● Especialista em Software Livre com ênfase em Redes - UNIPAN ● Bacharel em Informática - UNIOESTE Etapa 5 Administração do Sistema mcedit nano pico vi vim emacs Editores de texto useradd: apenas cria o usuário; adduser: cria usuário automatizado; passwd: altera a senha; usermod: modifica uma conta; userdel: remove usuário e arquivos; deluser: remove apenas o usuário; Criação e administração de usuários groupadd: adiciona grupo ao sistema; gpasswd: grava senha para o grupo; groupdel: remove o grupo do sistema; chage: configura expiração da conta; chage -E 2016-12-25 jefer Criação e Administração de grupos Gerenciamento de Permissões drwx------ ... 2 jefer ............. 512 Jan ... 29 23:30 .. Arquivos/ -rw-rw-r-- ... 1 jefer ....... 280232 Dec .. 16 22:41... notas.txt r => significa permissão de leitura (read); w => significa permissão de gravação (write); x => significa permissão de execução (execution); - => significa permissão desabilitada. Permissão Binário ----x -w-wx r-r-x rwrwx 000 001 010 011 100 101 110 111 Decimal 0 1 2 3 4 5 6 7 A ordem em que as permissões devem aparecer é rwx. Sendo assim, vamos entender a string do nosso exemplo dividindo-a em 4 partes: Drwx------ é um diretório (d); - o proprietário pode alterá-lo, gravá-lo e executá-lo (rwx); - o grupo não pode pode alterá-lo, gravá-lo, nem executá-lo (- - -); - os demais usuários não podem alterá-lo, gravá-lo, nem executálo (- - -). chmod: $ chmod 755 leiame.txt $ chmod u=rwx, go=rx leiame.txt $ chmod +x shell.sh chmod Chown altera dono e grupo $ chown jefer.posutfpr leiame.txt $ chowm .posutfpr leiame.txt $ chown -R jefer /home/jefer chown chgrp altera o grupo; $ chgrp -R users /home chgrp Instalação e gerenciamento de pacotes O APT busca em /etc/apt/sources.list por sua lista de origens (sources) http://www.debian.org/doc/manuals/apt-howto/index.pt-br.html apt Atualizando seu cache de pacotes local Toda vez que você quiser instalar ou atualizar um aplicativo, você primeiramente, deverá atualizar seu cachê de pacotes. Isso assegura que você tenha as últimas informações sobre o aplicativo que você está instalando. prompt$ apt-get update Vendo os pacotes disponíveis O utilitário apt-cache permite a você buscar no cachê de pacotes local por pacotes que contém certos textos. prompt$ apt-cache search apache Este comando retornou 119 pacotes na minha máquina. Em vez de ler todas as entradas, pode-se filtrar os resultados usando o comando grep $ apt-cache search apache | grep "^apache" Ver informações de um pacote prompt $ apt-cache show nomedopacote Instalar um pacote $ apt-get install nomedopacote Removendo um pacote $ apt-get remove nomedopacote Mantendo seu sistema atualizado $ apt-get update $ apt-get upgrade dpdddDD DPKG O dpkg complementa o apt-get, permitindo instalar pacotes . deb baixados manualmente. Digamos que você tenha baixado, por exemplo, o arquivo "skype_1.2.0.18-1_i386.deb", o pacote com o Skype, disponível no http://skype.com. Para instalá-lo, você usaria o comando: # dpkg -i skype_1.2.0.18-1_i386.deb /dev/hdX ou /dev/sdX fdisk: criar, listar, alterar e apagar partições; fdisk /dev/sda mkfs: formata as partições; mkfs -t vfat -I /dev/sdb mkswap: prepara a partição para trabalhar como swap; df: capacidade utilizada do disco; du: utilização do disco; fsck: checa e corrige erros; /etc/fstab Gerenciamento de partições Volumes lógicos (LVM) cat /proc/swaps free -ht s1 cat /proc/sys/vm/drop_caches Limpar: sysctl -w vm.drop_caches=1 SWAP mount [opções] [dispositivo] [ponto_de_montagem] ● -a : monta todos os sistemas de arquivos especificados no arquivo /etc/fstab. ● ro - monta somente como leitura; O arquivo /etc/mtab possui a lista de todos os sistemas de arquivos atualmente montados no Linux. O comando mount sem parâmetros faz o sistema listar o conteúdo do arquivo /etc/mtab. ● umount - desmonta sistemas de arquivos. Montagem e desmontagem de tar $ tar -cvf <arquivo_final> <origem> -c: create -v: verbosa -f: será definido nome do arquivo final <origem>: arquivo ou diretório que será compactado Exemplos: $ tar -cvf teste.tar * Compactação e descompactação de arquivos tar $ tar -cvf /tmp/gifs.tar /var/www/htnl/*.tar Descompactar: (-x descompacta o arquivo f) $ tar -xvf arquivo.tar Outras opções: (gzip/gunzip, tar+gzip, tar+bzip) $ ping $ ifconfig : ifconfig eth0 down : ifconfig eth0 10.0.0.1 netmask 255.0.0.0 $ ifup / ifdown : ativa ou desativa a interface de rede definada em /etc/network $ route: route add default gw 10.0.0.100 : route del default gw 10.0.0.100 $ dhclient eth0: solicitar dados de rede Comandos para gerenciamento de redes $ mii-tool: negociação de link de rede $ ethtool eth0 $ linx/links/elinks/links2 : navegadores $ wget: download de arquivos $ netstat: -tunap $nmap $ whois: dados sobre domínios $ geoiplookup: localização geográfica do ip $ iptraf: tráfego de rede $ ethstatus -i eth0 $ ipcalc 192.168.1.0/255.255.255.0 $ dig www.utfpr.br.edu (dnsutils) $ tcpdump: analisar de tráfego: tcpdump -nAi eth0 udp $ hostname adduser useradd userdel passwd su sux w whoami Gerenciamento de Contas cat tail head nano mcedit md5sum dd which detox df du durep mkdir rmdir cd pwd ls stat rm wipe cp mv find locate chmod chown ln diff cmp touch file tree Gerenciamento de Arquivos/Diretórios Memória free memstat pmap pid top htop iotop stress Processos ps kill killall jobs -l bg fg time nohup strace (strace -c ls /home) renice nice ionice fuser . renice +19 1000 -u jeferl nice -n -5 ntpd lsof -u user Gerenciamento de Processos cron 15 23 * * * /sbin/reboot $ crontab -l 0 0,12 * * 1-3 /sbin/reboot $ crontab -r */10 * * * * /sbin/reboot $ crontab -e sintaxe: minuto hora dia_do_mês mês dia_da_semana /path/comando Agendamento de Tarefas Diretórios de agendamento /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly a=`df -h | grep sda6 | cut -d"%" -f1 | tr -s " " | cut -d " " -f5` if [$a -gt 80] then echo " hd com $a" fi Etapa 6 Shell Script 1. 2. 3. 4. 5. 6. Introdução Instalação Virtualização Comandos básicos Administração do Sistema Shell Script jefer@acer:~$ cor=azul jefer@acer:~$ echo cor Cor jefer@acer:~$ echo $cor azul Iniciando #!/bin/bash echo 'Nossa! Estou vivo!' Tornemos então o arquivo executável: chmod +x arquivo.sh Ou chmod 755 arquivo.sh Para executar: ./arquivo.sh Se você der o comando "ps", vai ver que um dos programas rodando é o seu shell: jefer@acer:~$ ps PID TTY TIME CMD 164 tty2 00:00:00 bash 213 tty2 00:00:00 ps jefer@acer:~$ Ou seja, o shell utilizado nesse console é o bash, que está rodando com PID 164. bash Quer exemplos? file /usr/bin/* | grep shell Onde tem shell? É muito perigoso estudar shell usando o superusuário, você pode danificar o sistema com um comando errado. Se você não tem certeza qual o seu usuário, use o comando "whoami" para saber Shell A primeira linha de todo shell script deve começar com algo do tipo: #!/bin/bash , a qual indica com qual shell deverá ser executado o script. Bourne Shell (sh) Korn Shell (ksh) Boune Again Shell (bash) * C Shell (csh) Formato de Arquivos Algumas variáveis já são predefinidas no shell, como o PATH, que armazena o caminho dos programas. Por exemplo, a minha variável PATH contém: jefer@acer:~$ echo $PATH /usr/local/bin:/usr/bin: /bin: /usr/X11R6/bin: /usr/openwin/bin: /usr/games: /opt/kde/bin: /usr/share/texmf/bin: /etc/script É importante destacar que o shell possui várias variáveis prédefinidas, ou seja, que possuem um significado especial para ele, entre elas: PATH, PWD, PS1, PS2, USER e UID. Para conhecer mais variáveis de ambiente digite: env Variáveis de Ambiente Variáveis Prompt$ HOJE=$(date) echo "Hoje é: $HOJE" Sáb Abr 24 18:40:00 BRT 2004 unset HOJE echo $HOJE $ variavel="Eu estou logado como usuário $user" $ echo $variavel Eu estou logado como usuário cla $ variavel='Eu estou logado como usuário $user' $ echo $variavel Eu estou logado como usuário $user $ variavel="Meu diretório atual é o `pwd`" $ echo $variavel Meu diretório atual é o /home/cla Parâmetros Parâmetros $0 : é o nome do shell script (parâmetro zero); $1 a $9 : $1 é o primeiro parâmetro, $9 o nono, assim por diante; ${10}, ${11}.. quando o número do parâmetro possui mais de um dígito é necessário o uso das chaves; $* : todos os parâmetros em uma única string (exceto o $0); $@todos os parâmetros, cada um em string separadas (exceto $0); $# número de parâmetros (sem contar com o $0) $? valor de retorno do último comando; $$ PID do script. Parametros.sh !/bin/bash # "basename" serve para eliminar o caminho do arquivo e mostrar # somente o último nome dele. Neste caso: parametros.sh echo "Nome do script: `basename $0`" echo "Número total de parâmetros: $#" echo "Primeiro parâmetro: $1" echo "Segundo parâmetro: $2" echo "Décimo quinto parâmetro: ${15}" echo "Todos os parâmetros: $*" $ ./parametros.sh a b c d e f g h i j l m n o p q r s t u v xz Nome do script: parametros.sh Número total de parâmetros: 23 Primeiro parâmetro: a Segundo parâmetro: b Décimo quinto parâmetro: p Todos os parâmetros: a b c d e f g h i j l m n o p q r s tuvxz find / -name file -print #!/bin/bash find / -name $1 -print #o bash lê a variável "$1", ele a substitui pelo primeiro parâmetro passado na linha de comando para o nosso script. Passagem de Parâmetros #!/bin/bash echo "Vou buscar data do sistema. Posso continuar? [sn] " ; read RESPOSTA; test "$RESPOSTA" = "n" && exit echo "Data e Horário:" ;date ; #!/bin/bash read -p 'Qual foi sua nota na Prova?' nota if test -n "$nota" then if test "$nota" -gt 7 then echo "voce esta aprovado!" else if test "$nota" -eq 10 then echo "show! gabaritou!" else if test "$nota" -ge 2 && test "$nota" -lt 5 then echo "reprovado!" else if test "$nota" -lt 2 then echo "assinou o nome?" else echo "voce apenas passou!" fi ;fi ;fi ; fi ; fi Exemplo IF test #!/bin/bash echo "Vou buscar os dados do sistema. Posso continuar? [s/n] " read RESPOSTA test "$RESPOSTA" = "n" && exit echo "Data e Horário:" date echo "Uso do disco:" df echo "Usuários conectados:" w Interagindo c/ test O test pode apenas comparar strings, ou seja, verificar se uma é igual a outra, e verificar se uma string é vazia ou não. Vamos aos exemplos para facilitar o entendimento: jefer@acer:~$ test "a" = "a" jefer@acer:~$ echo $? 0 jefer@acer:~$ test "a" = "b" jefer@acer:~$ echo $? 1 jefer@acer:~$ test "a" != "b" jefer@acer:~$ echo $? Expressões usando strings: 0 jefer@acer:~$ test -z neo" jefer@acer:~$ echo $? 1 jefer@acer:~$ test -z "" jefer@acer:~$ echo $? 0 jefer@acer:~$ test -n “neo" jefer@acer:~$ echo $? 0 jefer@acer:~$ test -n "" jefer@acer:~$ echo $? 1 Ao lado temos os testes de vazio. A opção "-z" verifica se é vazio, e "-n" se não é vazio. No primeiro caso, ele testa se "neo" é uma string vazia, retornando falso. No segundo caso, como "" é vazia, retorna verdadeiro. O terceiro e quarto são semelhantes aos primeiros, mas com "-n". Os testes que podem ser feitos com arquivos são para verificar determinadas caracteristicas, como se ele existe, se é executável, se é um link simbólico, se é um diretório etc. Alguns exemplos: A opção "-e" verifica apenas se um arquivo existe e a opção "d" verifica se o arquivo é um diretório. A opção "-nt" verifica se o primeiro arquivo é mais novo que o segundo (nt = newer than) e "-ot" verifica se o primeiro é mais velho que o segundo (od = older than): Expressões com arquivos: jefer@acer:~$ test -e vmlinuz jefer@acer:~$ echo $? 0 jefer@acer:~$ test -d vmlinuz jefer@acer:~$ echo $? 1 jefer@acer:~$ test -e /usr jefer@acer:~$ echo $? 0 jefer@acer:~$ test -d /usr jefer@acer:~$ echo $? 0 jefer@acer:~$ test /usr -nt /vmlinuz jefer@acer:~$ echo $? 0 jefer@acer:~$ test /usr -ot /vmlinuz jefer@acer:~$ echo $? 1 A seguir, uma lista de várias opções disponíveis: * -b arquivo - Verdadeiro se arquivo é um arquivo de bloco, como /dev/hda. * -c arquivo - Verdadeiro se arquivo é um arquivo de caracter, como /dev/tty1. * -d arquivo - Verdadeiro se arquivo é um diretório. * -e arquivo - Verdadeiro se arquivo existe. * -f arquivo - Verdadeiro se arquivo existe e é um arquivo comum. * -s arquivo - Verdadeiro se arquivo existe e não é vazio. * -h arquivo - Verdadeiro se arquivo é um link simbólico. * -p arquivo - Verdadeiro se arquivo é um "named pipe" (fifo, lifo, etc). * -S arquivo - Verdadeiro se arquivo é um "socket". * -r arquivo - Verdadeiro se arquivo pode ser lido pelo usuário atual. * -w arquivo - Verdadeiro se arquivo pode ser escrito pelo usuário atual. * -x arquivo - Verdadeiro se arquivo pode ser executado pelo usuário atual. * -O arquivo - Verdadeiro se arquivo pertence ao usuário atual. * -G arquivo - Verdadeiro se arquivo pertence ao grupo do usuário atual. * -N arquivo - Verdadeiro se arquivo foi modificado desde a ultima vez que foi lido. o sinal de & depois de um comando. Exemplo: jefer@acer:~$ cp arquivo1 arquivo2 & [1] 206 A primeira informação ([1]) chama-se job. Ela identifica os programas que estão sendo executados em bg (background). A segunda informação (206) é o pid do programa, ou seja, o número de processo que o kernel dá a esse programa. Para retornar, usamos o comando fg [job] Execução em foreground e background Não são realmente comandos mas são conceitos muito importantes. pipes (|) envia o output (stdout) de um programa para o input (stdin) de um outro programa. cat ficheiro.txt |grep palavra | wc -l procura as linhas com a string PALAVRA no ficheiro.txt e conta as linhas. O output do comando grep é utilizado como input para o comando wc. Dessa forma você pode concatenar os comandos que queira Pipes, redirecionamento e backtick redirecionamento: escreve o output de um comando para um aruivo ou adiciona dados a um ficheiro: > escreve o output para um arquivo e sobrepõe o arquivo antigo caso ele existir Ex.: echo oi > oi.txt echo ola > oi.txt >> adiciona dados a um arquivo (ou cria um novo se ele ainda não existir mas nunca sobrepõe nada). Ex.: echo oi >> oi2.txt echo oii >> oi2.txt Backtick O output de um comando pode ser utilizado como argumento da linha de comandos para um outro comando. Você pode também utiliza-lo para definir o output de um comando para uma variável. O comando: find . -mtime -1 -type f -print procura todos os ficheiros que foram modificados nas ultimas 24 horas (-mtime -2 significaria 48 horas). Se você quer armazenar esse ficheiros num arquivo tar (ficheiro.tar) a syntax para o tar teria de ser: tar xvf ficheiro.tar ficheiro1 ficheiro2 ... Em vez de escrever isso tudo, você pode combinar 2 comandos (find e tar) utilizando backticks. Tar irá arquivar todos os ficheiro que find escreveu: #!/bin/sh # Backticks (`) , não plicas ('): tar -zcvf ultimamod.tar.gz `find . -mtime -1 -type f print` Estruturas de Controle Desvio e Repetição Estruturas de Desvio Condicionais são comandos que avaliam uma expressão. Se ela for verdadeira, uma determinada rotina é executada. Caso contrário, outra rotina pode ser executada. Controle de fluxo com: If Case Select o comando IF (ele é um comando embutido no bash e não um programa como o "ls", o "cp" etc.). A forma mais simples de representar uma condicional utilizando o IF, é da seguinte forma básica: if [condição]; then comandos1; else comandos2; fi; Se [condição] for verdadeira, os comandos1 são executados. Se for falsa, os comandos2 são executados.Mas para o IF, o que é uma condição verdadeira ou uma falsa? if Se [condição] for verdadeira, os comandos1 são executados. Se for falsa, os comandos2 são executados.Mas para o IF, o que é uma condição verdadeira ou uma falsa? TODO comando em Unix tem um código de retorno. Geralmente o código "0" (zero) significa que o comando foi executado perfeitamente e terminou bem. Códigos maiores que zero significam que alguma coisa de errado ocorreu. É assim que o IF verifica uma condição. Se o seu código de retorno for zero, então ela é considerada verdadeira. Caso contrario, ela é falsa.Mas então a [condição] tem que ser um comando, certo? Exemplo: jefer@acer:~$ if ls /boot; then echo "O diretório existe."; else echo "Diretório inválido."; fi; System.map boot.0300 boot.b boot_message.txt chain. b config map os2_d.b O diretório existe. O que aconteceu? Logo após o if, nós colocamos um comando: "ls /boot". O que o IF faz? Ele executa esse comando (por isso que temos a segunda linha começada por "System.map", que é o conteúdo do meu diretório /boot) e avalia o seu código de saída. Como o "ls" foi executado corretamente, ele retorna zero, significando verdadeiro para o IF, que executa o comando logo após o "then", ou seja, o echo "O diretório existe.", mostrando essa mensagem no console. Agora vamos colocar um diretório que não existe: jefer@acer:~$ if ls /dir_invalido; then echo "O diretório existe."; else echo "Diretório inválido."; fi; /bin/ls: /dir_invalido: Arquivo ou diretório não encontrado Diretório inválido. A lógica é a mesma. Executa o "ls /dir_invalido", que retorna um código maior que zero. O IF avalia como falso e executa o comando após o else: echo "Diretório inválido".. if [ -e $linux ] then echo 'A variável $linux existe.' else echo 'A variável $linux não existe.' fi O que este pedaço de código faz? O if testa a seguinte expressão: Se a variável $linux existir, então (then) ele diz que que existe com o echo, se não (else), ele diz que não existe. geralmente é utilizado como substituição de vários IFs. Um exemplo clássico e muito utilizado é quando precisa testar um parâmetro fornecido na linha de comando. O Case é utilizado desta forma em scripts de inicialização de serviços do sistema. Exemplo: um script que inicialize/reinicialize ou pare algum serviço (como o sendmail, apache, bind, etc). case Sintaxe: case <parâmetro> in opção 1 ) <comandos 1> ;; opção2 ) <comandos 2> ;; *) < comandos se não for nenhuma das opções > esac ;; Explicação: O Case pega a string fornecida em <parâmetro> e compara com <opção 1>. Se forem iguais, ele executa <comandos 1> e sai fora. Caso contrario, ele compara <parâmetro> com <opção 2> e assim por diante. Caso <parâmetro> não seja igual a nenhuma das opções, ele executa os comandos da opção "*", se este existir. IMPORTANTE: Prestem atenção a alguns detalhes na sintaxe. Deve existir um ")" após cada opção e também um ";;" após todos os comandos de cada opção. Vejam o exemplo: case "$1" in 'start' ) echo "Iniciando o serviço..." <comandos para iniciar o serviço> ;; 'restart' ) echo "Reinicializando o serviço..." <comandos para reinicializar o serviço> 'stop' ) echo "Parando o serviço..." <comandos para parar o serviço> ;; *) echo "Opção invalida!" echo "As opções válidas são: start, stop e restart" ;; esac ;; O Case serve para evitar o teste de vários Ifs. No caso acima, teríamos que utilizar 3 Ifs. Mesmo se o primeiro já fosse verdadeiro, o bash iria testar o segundo e o terceiro, ou seja, ia perder tempo desnecessariamente. Já no case isso não acontece. Após entrar em uma opção e executar seus comandos, ele já pula fora do case sem testar as outras opções abaixo. O Select é um comando de laço que nos permite mostrar um pequeno menuzinho de opções para o usuário. Cada opção possui um número e para escolher, o usuário digita o número correspondente a opção desejada. Vejamos a sintaxe a seguir: select <var> in <lista de opções>; do <comandos> done; select o select vai mostrar as opções contidas em <lista de opções>, uma por linha, com um número na frente e espera que o usuário digite a opção desejada. Ao digitar a opção, o select atribui o nome da opção a variável <var> e executa os comandos. Para sair do select, é necessário executar o comando "break". Vamos a um exemplo: select x in Iniciar Reiniciar Parar Sair; do echo "Opção Escolhida: $x" if [ "$x" == "Sair" ]; then break; fi; done; se o usuário escolher alguma opção diferente de "Sair", o script apenas escreve a opção. Se for escolhida Sair, ele mostra a opção, entra no IF e executa o break, saindo do select. É interessante combinar o Select com o Case. Vamos mostrar como ficaria aquele exemplo do case, de iniciar um serviço, utilizando o Select, para tornar o script interativo: select x in Iniciar Reiniciar Parar Sair; do case "$x" in 'Iniciar' ) echo " Iniciando o serviço..." ;; 'Reiniciar' ) echo " Reinicializando o serviço..." ;; 'Parar' ) echo " Parando o serviço..." ;; 'Sair' ) echo " Script encerrado." break ;; *) echo " Opção inválida!" ;; esac done; Primeiramente o Select mostra um menu: 1) Iniciar 2) Reiniciar 3) Parar 4) Sair #? Quando o usuário digitar um número de opção, o select executa o case e este compara a variável x com suas opções. Se achar alguma, executa seus comandos, no caso um echo. Se o usuário escolher Sair, além do echo, ele executa o "break", que interrompe o select: neo@matrix:~/test$ ./t 1) Iniciar 2) Reiniciar 3) Parar 4) Sair #? 1 Iniciando o serviço... 1) Iniciar 2) Reiniciar 3) Parar 4) Sair #? 5 Opção inválida! 1) Iniciar 2) Reiniciar 3) Parar 4) Sair #? 4 Script encerrado. neo@matrix:~/test$ Estruturas de Repetição while until for Ele testa uma condição (como faz o IF) e executa um conjunto de comandos se esta condição for verdadeira. Após a execução desses comandos, ele torna a testar a condição e se esta for verdadeira, ele reexecuta os comandos e assim por diante. Sua sintaxe é a seguinte: while [ condição ]; do comando 1; comando 2; ... done; WHILE O parâmetro [ condição ] funciona exatamente igual ao do IF. Não voltarei a abortar os parâmetros condicionais pois eles já foram explicados na aula 3. Em caso de dúvida sobre isso, uma rápida revisão na aula 3 é suficiente. Bom, vamos ao exemplo mais simples do While: um contador. x=0 While [ "$x" -le 10 ]; do echo "Execução número: $x"?; x = $((x+1)); done; Analisando: Na primeira linha temos a condição: enquanto o valor da variável x ( $x ) for menor-igual ( -le ) a 10, faça: mostre "Execução número: " e o valor de x ($x). Faça x = x + 1. Isso no bash é feito pelo comando $(( )). Ele realiza operações algébricas com variáveis. No caso acima, estamos somando x + 1 e colocando o resultado no próprio x. Preste atenção, que as linhas do While precisam de um ";" para terminar, exceto a que contém o "do", pois ele representa o começo do bloco de comandos. Quando executamos o script acima, temos uma contagem de 1 até 10: jefer@acer:~$ x=0; while [ "$x" -lt 10 ]; do x=$((x+1)); echo "Execução número: $x"; done; Execução número: 1 Execução número: 2 ... Execução número: 9 jefer@acer:~$ Tem as mesmas características do while, a única diferença é que ele faz o contrário. Veja o exemplo abaixo: variavel="naovalor" until [ $variavel = "valor" ]; do comando1 comando2 done until Ao invés de executar o bloco de comandos (comando1 e comando2) até que a expressão se torne falsa, o until testa a expressão e executa o bloco de comandos até que a expressão se torne verdadeira. No exemplo, o bloco de comandos será executado desde que a expressão $variavel = “valor” não seja verdadeira. Se no bloco de comandos a variável for definida como “valor”, o until pára de executar os comandos quando chega ao done. Um exemplo para o until que, sintaticamente invertido, serve para o while também: var=1 count=0 until [ $var = "0" ]; do comando1 comando2 if [ $count = 9 ]; then var=0 fi count=`expr $count + 1` done Primeiro, atribuímos à variável “$var” o valor “1″. A variável “$count” será uma contagem para quantas vezes quisermos executar o bloco de comandos. O until executa os comandos 1 e 2, enquanto a variável “$var” for igual a “0″. Então usamos um if para atribuir o valor 0 para a variável “$var”, se a variável “$count” for igual a 9. Se a variável “$count” não for igual a 0, soma-se 1 a ela. Isso cria um laço que executa o comando 10 vezes, porque cada vez que o comando do bloco de comandos é executado, soma-se 1 à variável “$count”, e quando chega em 9, a variável “$var” é igualada a zero, quebrando assim o laço until O for é semelhante ao while usado como um contador. for <var> in <lista>; do comandos done; O For associa o primeiro item da lista de nomes à variável <var> e executa os comandos. Em seguida, associa novamente o segundo item da lista à <var> e executa novamente os comandos... e assim por diante, até acabar a lista. for jefer@acer::~$ for x in Compra Venda Aluguel; do echo $x; done; Compra Venda Aluguel Ou seja, primeiro ele coloca "Compra" na variável x e executa os comandos, no caso, "echo $x", e assim por diante. Podemos facilmente implementar um contador, usando em conjunto com o for, o programinha "seq". Ele simplesmente gera uma seqüência de números. Por exemplo, "seq 10" gera uma seqüência de 1 até 10. Assim, podemos usá-lo no for: for x in $(seq 10); do echo $x; done; Esse comando é semelhante ao contador implementado com o While. Primeiro o x vale 1 e o for executa os comandos. Depois x vale 2 e ele reexecuta os comandos... Vamos usar o For para renomear os arquivo de um diretório, mudando todos os arquivo terminados em ".mp3" para ".mp3.bak". for x in *; do mv "$x" "${x}.bak"; done; for x in *.mp3; do if [ -e "$x" ]; then mv "$x" "${x}.bak"; fi; done; No local de <lista> nos colocamos "*.mp3". Isso diz ao bash para expandir (transformar) ele na lista de arquivos terminados com ". mp3". Senão houver nenhum arquivo com essa terminação, o bash não faz nada, ficando para o for a string "*.mp3". Por isso precisamos do IF para testar se o arquivo existe. Experimente no seu sistema. echo *.mp3 Vai mostrar os arquivos no diretório atual com terminação mp3, mas sem quebra de linha entre eles, ou seja, um nome após o outro. Se não houver nenhum arquivo com terminação mp3, ele apenas vai mostrar "*.mp3" Bom, voltando ao For, ele vai atribuir a "x" cada nome na lista de arquivos com terminação ".mp3" e executar os comandos seguintes. Primeiro ele testa para ver se o arquivo existe ( if [ -e "$x" ]; ), e se existir, renomeia ele para o seu próprio nome acrescido de ".bak" ( ${x}.bak ). Resumindo, o For faz isso: você fornece uma lista de nomes para ele e ele vai atribuindo esses nomes, em ordem e um por vez, à variável <var> e executa os comandos entre o "do" e o "done;". metacaracteres São caracteres especiais. Quando eles são digitados são interpretados de outra forma. Podem ser usados para especificar um ou uma cadeia de outros caracteres. O shell procura no diretório corrente arquivos que casem com esse padrão e os expande. Usando caracteres coringas Geralmente o caracter "*" é um coringa que significa "qualquer caracter em qualquer quantidade". Por isso se a gente executar "ls *", onde "*" entra no lugar do "nome do arquivo", significando qualquer string de qualquer tamanho. Por isso ele lista todos os arquivos. Faixas de caracteres também são permitidos: [0-3] é o mesmo que [0123] [a-k] é o mesmo que [abcdefghijk] [A-C] é o mesmo que [ABC] [A-Ca-k] é o mesmo que [ABCabcdefghijk] Existem também algumas formas alternativas: [[:alpha:]] é o mesmo que [a-zA-Z] [[:upper:]] é o mesmo que [A-Z] [[:lower:]] é o mesmo que [a-z] [[:digit:]] é o mesmo que [0-9] [[:alnum:]] é o mesmo que [0-9a-zA-Z] [[:space:]] casa com qualquer quantidade de espaços O grep basicamente faz buscas. Mais precisamente: grep palavra file retorna todas as linhas do arquivo file que contenham palavra Outro jeito de usar o grep é atraves de pipe (lembram dos pipes?). Por exemplo: ls | grep palavra Lista todos os arquivos que contenham palavra em seu nome. Ou seja, a entrada do grep é uma lista de arquivos (gerada pelo ls) que será filtrada, sendo impressas somente as linhas que contenham palavra. grep >cat file file big bad bug bigger boogy "." significa "qualquer e apenas um caracter". Para significar strings arbitrárias utilizamos "*". Intervalo numerico: ls oi[0-9].txt Exemplo 1: >cat file O gato preto foi caçado por um cachorro marrom. >sed -e 's/preto/branco/g' file O gato branco foi caçado por um cachorro marrom. sed Funções Funções são blocos de comandos que podem ser definidos para uso posterior em qualquer parte do código. sintaxe de uma função: funcao() { comando1 comando2 ... } A função funcionará como um simples comando próprio. Você executa a função em qualquer lugar do script shell, e os comandos 1, 2 e outros serão executados. A flexibilidade das funções permite facilitar a vida do programador, e organizar Shellzin Gráfico Xdialog --title "Exemplo número 2!" --stdout --yesno \ "Neste exemplo, vamos ver o que você quer fazer. Você deseja continuar com o programa?" \ 00 if [ $? = "0" ]; then echo "Que bom! Você continuou o programa! Parabéns!" elif [ $? = "1" ]; then echo "Você saiu do programa..." fi Shell com janelas Xdialog --title "Exemplo número 1!" --center --stdout -yesno \ "Isto é legal?" \ 00 http://aurelio.net/shell/dialog/ Xdialog --title "Exemplo número 2!" --center --stdout -yesno \ "Neste exemplo, vamos ver o que você quer fazer. Você deseja continuar com o programa?" \ 00 if [ $? = "0" ]; then echo "Que bom! Você continuou o programa! Parabéns!" elif [ $? = "1" ]; then echo "Você saiu do programa..." fi mais janelas #!/bin/bash kdialog --msgbox "Olá, tudo bem?" kdialog --inputbox "Canal a gravar (ex: 12)" 10 60 "12" 2> /tmp/resposta.tmp canal=`/tmp/resposta.tmp` kdialog --passivepopup "Esta janela some sozinha depois de 6 segundos." 6 & arquivo=`kdialog --getsavefilename "/home/kurumin/Desktop" \ "*.txt |Arquivos de texto" kdialog Xdialog --title "Aviso" --center --stdout --msgbox \ "Este programa é apenas um exemplo para você ver como o Xdialog \ \nfunciona. Apropósito, se você praticar bastante pode criar \ \nprogra mas incríveis e facilmente, que daria muito mais \ \ntrabalho fazendo em outras linguagens." \ 00 mais janelas dialog --title "Exemplo de Menu" --center --stdout -menubox \ "Qual sua distribuição Linux favorita?" \ 20 50 0 \ 1 "Slackware" \ 2 "Debian" \ 3 "Red Hat" \ 4 "Conectiva Linux" \ 5 "Eu tenho minha própria distribuição" mais janelas Xdialog --title "Exemplo de Menu" --center --stdout --menubox \ "Qual sua distribuição Linux favorita?" \ 20 50 0 \ 1 "Slackware" \ 2 "Debian" \ 3 "Red Hat" \ 4 "Conectiva Linux" \ 5 "Eu tenho minha própria distribuição" #!/bin/bash kdialog --msgbox "Olá, tudo bem?" kdialog --inputbox "Canal a gravar (ex: 12)" 10 60 "12" 2> /tmp/resposta.tmp canal=`/tmp/resposta.tmp` kdialog --passivepopup "Esta janela some sozinha depois de 6 segundos." 6 & arquivo=`kdialog --getsavefilename "/home/kurumin/Desktop" \ "*.txt |Arquivos de texto"` #!/bin/sh #Desenvolvido por Jefer Benedett Dorr ([email protected]) #script para configurar rede do meu note na pos da unipan kdialog --title "Script Configurador para Rede Unipan" --passivepopup "Aguarde....... Configurando a rede" 3 #msg passiva no canto superior esquerdo clear ifconfig eth0 down ifconfig eth0 up echo "iniciando configuração" ifconfig eth0 192.168.90.117 netmask 255.255.255.0 up echo "adicionando rota" route add default gw 192.168.90.1 #adicionar dns no resolv echo "adicionando dns no resolv.conf" echo "nameserver 192.168.90.1" >> /etc/resolv.conf echo "testando conexao..........." if ping -c 3 www.unipan.br then echo "Conexão --------- OK " echo "Conexão Testada ;)" else echo "Bahh!! Conexão Falhou!" exemplo fi Papo de Botequim – Julio Neves - http://twiki.softwarelivre. org/TWikiBar Shell Script: Porque programar tem que ser divertido – Aurélio Marinho Jargas - http://aurelio.net/shell/ Guia do Hardware – Carlos Morimotto http://www.gdhpress.com.br/ferramentas/leia/index.php? p=cap4-1 http://lcnsqr.byethost9.com/? sec=lpic&exam=102&node=13 Sobre Shell Livros Filmes Piratas do Vale do Silício Revolution OS The code Linux Simulados http://www.lpibrasil.com.br/simulados http://www.vivaolinux.com.br/scripts/download.php?codigo=5156 Show do Milhão: http://www.fuctura.com.br/jogolpi/