desafio 4

This commit is contained in:
Blau Araujo 2025-08-16 10:35:35 -03:00
parent 1c89536c2f
commit cee7f745eb

138
desafios/04/README.org Normal file
View file

@ -0,0 +1,138 @@
#+title: Shell Script na Prática
#+author: Blau Araujo
#+email: blau@debxp.org
* Desafio 4: Novo arquivo
** Objetivos
- Manipulação de argumentos
- Separação de palavras em campos
- Vetores associativos
- Menu de seleção do Bash
- Criação de menus customizados
- Criação de menus com Fuzzy Finder
- Estrutura de seleção
- Execução de programas
- Leitura e escrita em arquivos
- Filtragem de texto
** Enunciado
Criar um programa que crie um novo arquivo de um dado modelo e o abra no
editor adequado. O programa será chamado de ~nf~ e a sintaxe de uso será:
#+begin_example
nf NOVO_ARQUIVO[.EXT]
nf [OPÇÕES]
#+end_example
O programa será chamado de ~nf~ (de /new file/) e receberá as seguintes opções:
- ~--list~ ou ~-l~: Lista os modelos disponíveis e o editor associado.
- ~--help~ ou ~-h~: Exibe ajuda de uso.
- ~--version~ ou ~-v~: Exibe informações de versão e copyright.
#+begin_quote
Na ausência do nome do novo arquivo, a ajuda deverá ser impressa
e o programa terminará com erro.
#+end_quote
A associação de modelos e editores será feita com base na extensão do nome
do arquivo a ser criado, por exemplo:
- ~.asm~: arquivo de um programa em Assembly (NASM)
- ~.bash~ ou sem extensão: arquivo de script em Bash
- ~.c~: arquivo de um programa em C
- ~.md~: arquivo-texto formatado em GitHub Markdown
- ~.org~: arquivo-texto formatado em Org Mode (Emacs)
- ~.s~: arquivo de um programa para o /GNU Assembler/ (GAS)
- ~.sh~: arquivo de script para o shell ~sh~
- ~.txt~: arquivo-texto plano (/raw text/)
Os arquivos de modelo deverão ser criados no diretório: =~/.config/nf/modelos=
e seus nomes devem ser iguais às extensões a que estão associados.
Exemplo:
#+begin_example
.config/
└─ nf/
├─ modelos/
│ ├─ asm
│ ├─ bash
│ ├─ c
│ ├─ md
│ ├─ org
│ ├─ s
│ ├─ sh
│ ├─ txt
│ └─ ...
└─ config
#+end_example
O arquivo =~/.config/nf/config= deve conter a associação das extensões com
os respectivos editores:
#+begin_example
DEFAULT='emacs -nw'
editor[asm]=$DEFAULT
editor[bash]=$DEFAULT
editor[c]=geany
editor[md]=ghostwriter
editor[txt]=nano
#+end_example
O editor definido em ~DEFAULT~ será usado para qualquer extensão sem editor
definido na configuração.
** Evolução 1
Sem argumentos, o programa deve exibir um menu com os modelos disponíveis.
Exemplo:
#+begin_example
NOVO ARQUIVO
[1] asm
[2] bash
[3] c
[4] md
[5] org
[6] s
[7] sh
[8] txt
Modelo (tecle <q> para sair):
#+end_example
Em seguida, deve ser apresentado um /prompt/ para a digitação (obrigatória)
do nome do arquivo:
#+begin_example
Nome do arquivo:
#+end_example
Se o campo for deixado vazio, deve ser apresentada uma opção de tentar
novamente:
#+begin_example
Nome do arquivo:
O nome do arquivo é obrigatório!
Tecle <enter> para tentar novamente ou <c> para cancelar:
#+end_example
** Evolução 2
Implementar uma opção de menu para criar um novo modelo usando o editor
padrão para criar o arquivo de modelo e um prompt para a escolha do
editor.
** Evolução 3
Utilizar a ferramenta ~fzf~ para exibir o menu.