139 lines
3.1 KiB
Org Mode
139 lines
3.1 KiB
Org Mode
|
#+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.
|
||
|
|