#+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 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 para tentar novamente ou 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.