elgio
(usa OpenSuSE)
Enviado em 20/05/2011 - 17:22h
Como bem já disseram antes, ajudar é bem diferente do que fazer pra ti. Na tua postagem (e nos dois emails que me enviastes) tu não manifesta dúvida alguma. Apenas passas a listas de exercícios e espera que te enviemos as respostas?
Vamos por partes:
"Fazer uma função que receba uma string como parâmetro e imprima somente os caracteres de A até Z, maiúsculos ou minúsculos."
Sabes como definir uma função em bash? Como enviar parâmetros a ela? Comece por ai. Que tal um ponto de partida, uma função que recebe uma string e apenas a imprime em maiúscula?
#---- INICIO
#!/bin/bash
function maiusculas()
{
echo $* | tr a-z A-Z
}
maiusculas apenas um teste
maiusculas "Isto eh Outro teste"
#---- FIM
Comece testando este script. A partir disto, fazendo uso de cut (para cortar a string caractere por caracter) e grep (para ver se o caractere é uma letra) deve ser suficiente (mas não vou fazer pra ti).
"Fazer um script que liste o username e o nome completo de todos us usuários do sistema que possuam senha. Será preciso ter acesso ao arquivo “/etc/shadow”.
Não entendi o contexto desta questão. O que se quer dizer com "possuem senha"? Isto tem várias interpretações e certamente a correta depende do que se estava estudando quando o exercício foi sugerido.
Alguém que tem o campo de senha vazio é considerado sem senha? Alguém que sequer tem entrada no /etc/shadow é considerado sem senha? Alguém que teve a conta bloqueada é considerado sem senha? Estranho, porque os nomes dos usuários estão em /etc/passwd e as "senhas" no /etc/shadow. Para cada entrada no /etc/passwd deveria ter uma no /etc/shadow
De qualquer manera um laço pegando o username em /etc/passwd (com um cut -d: -f1), e depois para cada username verificando (com grep) se ele existe e se tem senha (???) em use grep para pegar o nome dele no /etc/passwd. Acredito que um grep "^${username}:" /etc/passwd | cut -d: -f5 |cut -d, -f1 deva ser suficiente (username deve ser a variável do laço).
"Fazer um script que liste todos os usuários do sistema, mostrando apenas seu primeiro nome e sem repetição de nome."
Nada como o cut semelhante ao que sugeria acima (cut -d: -f5|cut -d: -f1) o resto tu faz. Podes usar o sort ou o uniq para remover nomes duplicados.
"Fazer um script que mostre todos os parâmetros recebidos pela linha de comando e no final informe quantos parâmetros foram passados."
Este é o mais fácil de todos. Todos os parâmetros estão em $*. A quantidade deles pode ser obtida por $#
"Leia o nome de 4 arquivos e no final gere uma lista com o conteúdo dos 4 arquivos ordenados e sem repetição."
Terás que usar read para ler os nomes de cada arquivo. Para cada arquivo um sort com os devidos parâmetros, faz o trabalho completo (o próprio sort tem um parâmetro para eliminar duplicadas. Pesquise)
"Fazer um script que entro com o nome de um arquivo, um texto a ser buscado e um texto para substituir o texto buscado. O script deverá mostrar na tela um novo texto com as substituições realizadas."
Novamente usa-se read para ler as entradas. Depois o sed faz todo o trabalho: sed '/TEXTO_PROCURA/TEXTO_SUBSTITUIR/g' arquivo
"Fazer um script que receba duas datas no formato DDMMAAAA e retorne a diferença de dias entre elas."
Pegadinha. Pra fazer isto de forma precisa terias que considerar mêses de 31 dias e anos bisexto. Muito complicado na mão.
Mas podes usar o comando date para retornar a quantidade de segundos da data! O comando date "+%s" retorna a quantidade de segundo AGORA. Mas pode pedir para ele retornar a quantidade para qualquer data:
date "+%s" -d 20110510
(para o dia 10 de Maio de 20011)
Então, se tu pegar em segundos a data final, diminuir da data inicial, terá quantos segundos se passaram. Divide por 3600 e depois por 24 e terás quantos dias se passaram.
Exemplo:
DATA2="20110530" # 30 de Maio deste ano
DATA1="20110430" # 30 de Abril deste ano
SEG1="`date "+%s" -d $DATA1`"
SEG2="`date "+%s" -d $DATA2`"
SEGUNDOS=$(( $SEG2 - $SEG1 ))
DIAS=$(( $SEGUNDOS / 3600 / 24 ))
echo "De $DATA2 ate $DATA1 passaram-se $DIAS dias"
Execute o código acima e altere ele para o programa acima.
"Fazer uma função para varrer uma árvore de diretórios e listar todos os arquivos encontrados. A listagem deverá estar ordenada pelo nome do arquivo e conter, ao lado do nome do arquivo, o diretório onde ele se encontra."
Podes usar o find para isto, que já retorna o path inteiro.
A saida do find pode ser concatenada com um sed, para separar o diretorio do nome, e tudo isto passando pelo sort.
Isto pode ser feito em uma única linha de comando!
Como esta solução por linha de comando é complexa, talvez tenhas mais suecesso e alimentar um while pela saida do laço. Cada iteração do laço pode extrair o arquivo com o basename e o diretorio com dirname.
Exemplo:
PATHCOMPLETO="/usr/lixo/caca/arquivo.txt"
DIR="`dirname $PATHCOMPLETO`"
ARQUIVO="`basename $PATHCOMPLETO`"
echo "$DIR $ARQUIVO"
Se tiver dúvidas, mas que sejam DÚVIDAS pontuais, torne a me contactar. Eu te ajudo de danto o rumo.
Se queres que eu te envie alguma resposta completa de algum destes exercícios, desista. Não farei isto.
PS: Tenha a mais absoluta certeza de que gastei muito, mas MUITO mais tempo te escrevendo este tutorial do que se tivesse feito todos estes scripts e te enviado. Me seria muito menos demorado te enviar a resposta. Mas isto é contra os meus princípios.
[]'s