anotações da aula 1
This commit is contained in:
parent
0cc372e822
commit
584376fca3
2 changed files with 229 additions and 0 deletions
217
01/README.org
217
01/README.org
|
@ -36,4 +36,221 @@ invocação do script, que substituirá a palavra ~simpatia~.
|
||||||
Tornar a impressão da palavra ~simpatia~ condicionada à ausência do primeiro
|
Tornar a impressão da palavra ~simpatia~ condicionada à ausência do primeiro
|
||||||
argumento na invocação do script.
|
argumento na invocação do script.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Anotações da aula 1
|
||||||
|
|
||||||
|
** O que é um shell
|
||||||
|
|
||||||
|
Em sistemas parecidos com o Unix (/unix-like/), como o GNU/Linux, o shell é um
|
||||||
|
programa que exerce três funções básicas:
|
||||||
|
|
||||||
|
*Interface padrão entre o usuário e o sistema:*
|
||||||
|
|
||||||
|
- Quando um terminal é disponibilizado para o usuário, um shell é iniciado para
|
||||||
|
que o usuário digite seus comandos;
|
||||||
|
|
||||||
|
- Quando o usuário tecla =ENTER=, a linha com o seu comando é enviado para o
|
||||||
|
shell;
|
||||||
|
|
||||||
|
- O shell, então, inicia o processamento da linha do comando para determinar o
|
||||||
|
que deve ser executado;
|
||||||
|
|
||||||
|
- Ao fim do processamento, o shell providencia a execução do que foi solicitado
|
||||||
|
pelo usuário.
|
||||||
|
|
||||||
|
*Interpretador de comandos:*
|
||||||
|
|
||||||
|
No papel de interpretador, o shell deve processar a linha do comando digitado
|
||||||
|
pelo usuário a fim de determinar o que deve ser executado.
|
||||||
|
|
||||||
|
O shell pode interpretar comandos de dois modos:
|
||||||
|
|
||||||
|
- *Modo interativo:* os comandos são digitados diretamente no terminal e
|
||||||
|
executados um a um.
|
||||||
|
|
||||||
|
- *Modo não interativo:* os comandos são escritos antes do shell ser executado
|
||||||
|
para interpretá-los, como em scripts ou como argumentos da opção =-c= do shell.
|
||||||
|
|
||||||
|
*Plataforma de operação do sistema:*
|
||||||
|
|
||||||
|
Como o shell é a interface padrão do sistema, além de seus comandos e mecanismos
|
||||||
|
internos, inúmeros programas, para as mais diversas finalidades, são criados para
|
||||||
|
serem utilizados no terminal através do shell, o que termina por constituir um
|
||||||
|
ambiente de operação completo e coerente (uma /plataforma/) para a execução de
|
||||||
|
tarefas e operação do sistema.
|
||||||
|
|
||||||
|
** O que é um comando
|
||||||
|
|
||||||
|
Um /comando/ é a expressão da vontade do usuário na forma de uma linha de texto
|
||||||
|
escrita segundo uma sintaxe bem definida. Na sua forma mais simples, um comando
|
||||||
|
é composto por:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
[EXPORTAÇÕES] [[INVOCAÇÃO] [ARGUMENTOS]] [REDIRECIONAMENTOS]
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
Onde:
|
||||||
|
|
||||||
|
- *Exportações:* Atribuições de /nomes/ a variáveis, no formato ~NOME=VALOR~, que
|
||||||
|
serão exportadas para o programa ou comando que for /invocado/; caso a linha não
|
||||||
|
tenha uma ~INVOCAÇÃO~, as variáveis serão definidas para uso no próprio shell.
|
||||||
|
|
||||||
|
- *Invocação:* Palavra que corresponde ao que deve ser executado, podendo ser o
|
||||||
|
nome do arquivo executável ou um comando interno do shell (/builtin/).
|
||||||
|
|
||||||
|
- *Argumentos:* Todas as palavras escritas depois do nome do que estiver sendo
|
||||||
|
invocado é interpretada como /argumento/ da invocação e serão passadas para
|
||||||
|
o que vier a ser executado.
|
||||||
|
|
||||||
|
- *Redirecionamentos:* O que define o fim da lista de palavras que compõem a
|
||||||
|
~INVOCAÇÃO~ e seus eventuais ~ARGUMENTOS~ é o fim da linha ou a presença de
|
||||||
|
um /operador/; se o operador for composto pelos caracteres ~<~ ou ~>~, eles
|
||||||
|
indicarão que os dados produzidos pelo comando (a sua /saída/), em vez de
|
||||||
|
serem exibidos no terminal, serão escritos em um arquivo ou, na direção
|
||||||
|
contrária, que o comando receberá dados através da leitura de um arquivo.
|
||||||
|
|
||||||
|
** O que são scripts
|
||||||
|
|
||||||
|
Scripts são arquivos-texto contendo os comandos que o shell deve executar de
|
||||||
|
modo /não interativo/. Como parte de seus mecanismos internos, o shell oferece
|
||||||
|
diversos recursos para controlar como, quando e com que dados os comandos
|
||||||
|
devem ser executados -- em outras palavras, esses mecanismos tornam possível
|
||||||
|
a criação de /programas/.
|
||||||
|
|
||||||
|
** Como criá-los
|
||||||
|
|
||||||
|
Para criar um script, basta criar um arquivo-texto com os comandos. Para isso,
|
||||||
|
nós precisamos de um editor (como: Vim, Nano, Micro, Emacs, etc) ou podemos
|
||||||
|
utilizar os próprios recursos do shell.
|
||||||
|
|
||||||
|
** Como executá-los
|
||||||
|
|
||||||
|
O conteúdo do script terá que ser interpretado e executado pelo shell, o que
|
||||||
|
pode ser feito de duas formas básicas:
|
||||||
|
|
||||||
|
*Arquivos sem permissão de execução*
|
||||||
|
|
||||||
|
Apenas arquivos com o atributo de execução ativados podem ser executados a
|
||||||
|
partir da invocação de seus nomes. Sem essa permissão, o nome do arquivo do
|
||||||
|
script pode ser passado como argumento da invocação do shell:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
:~$ bash meu-script.sh
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
*Arquivos com permissão de execução*
|
||||||
|
|
||||||
|
Se o atributo de execução estiver ativo, e o usuário tiver permissão para
|
||||||
|
executá-lo, basta invocar o caminho e o nome do arquivo do script:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
:~$ ./script1.sh # O script está no diretório onde é invocado.
|
||||||
|
:~$ ~/bin/script2.sh # O script está em /home/usuário/bin.
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
Contudo, quando iniciado no modo /interativo/, o shell recebe uma variável,
|
||||||
|
de nome ~PATH~, cujo valor associado é uma lista de diretórios em que arquivos
|
||||||
|
executáveis devem ser procurados. Se o script estiver em algum desses
|
||||||
|
diretórios, basta invocar seu nome:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
:~$ meu-script.sh
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
** Como o script é executado
|
||||||
|
|
||||||
|
A não ser que um interpretador seja especificado (ou invocado), todo
|
||||||
|
arquivo-texto será lido e executado como se contivesse apenas comandos
|
||||||
|
do shell em execução no terminal. Para especificar um interpretador
|
||||||
|
no próprio script, ele deve iniciar com uma /hashbang/ (~#!~), ou /linha do
|
||||||
|
interpretador de comandos/.
|
||||||
|
|
||||||
|
No caso do Bash, a /hashbang/ pode ser escrita de várias formas:
|
||||||
|
|
||||||
|
- ~#!/bin/bash~
|
||||||
|
- ~#!/usr/bin/bash~
|
||||||
|
- ~#!/usr/bin/env bash~
|
||||||
|
|
||||||
|
A presença da /hashbang/ na primeira linha do script diz ao shell quem
|
||||||
|
deverá ser utilizado para executar o conteúdo do arquivo. Internamente,
|
||||||
|
isso tem o mesmo efeito de:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
:~$ /bin/bash SCRIPT
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
** Como imprimir mensagens no terminal
|
||||||
|
|
||||||
|
Existem várias formas, mas o shell tem dois comandos internos dedicados
|
||||||
|
a essa finalidade:
|
||||||
|
|
||||||
|
- ~echo~: imprime seus argumentos separados por um espaço e com uma quebra
|
||||||
|
de linha do final.
|
||||||
|
|
||||||
|
- ~printf~: imprime seus argumentos conforme uma formatação especificada
|
||||||
|
como primeiro argumento.
|
||||||
|
|
||||||
|
** O que são variáveis
|
||||||
|
|
||||||
|
No shell, variáveis são /nomes/ que identificam valores que podem ser criados
|
||||||
|
e alterados. Para ser válido como identificador de uma valor, o nome deve
|
||||||
|
conter apenas caracteres alfabéticos maiúsculos e minúsculos, o caractere
|
||||||
|
sublinhado (~_~) e números, mas não pode começar com números.
|
||||||
|
|
||||||
|
** O que são parâmetros
|
||||||
|
|
||||||
|
O shell também faz associações entre identificadores e valores com variáveis.
|
||||||
|
Mas, os valores que não podem ser criados ou alterados diretamente por nós
|
||||||
|
são identificados por caracteres inválidos para /nomes/ (como números e outros
|
||||||
|
símbolos gráficos). Esses identificadores são chamados de /parâmetros/ e podem
|
||||||
|
ser classificados como /parâmetros posicionais/ e /parâmetros especiais/.
|
||||||
|
|
||||||
|
*Parâmetros posicionais:*
|
||||||
|
|
||||||
|
| Identificador | Valor associado |
|
||||||
|
|---------------+--------------------------------------------------------------|
|
||||||
|
| ~0~ | A palavra utilizada como ~INVOCAÇÃO~ na linha do comando |
|
||||||
|
| ~1..N~ | Cada palavra utilizada como ~ARGUMENTO~ conforme sua posição. |
|
||||||
|
| ~#~ | A quantidade de argumentos (exclui a invocação da contagem). |
|
||||||
|
| ~@~ | A lista de todas as palavras utilizadas como argumentos. |
|
||||||
|
| ~*~ | A lista de todas as palavras utilizadas como argumentos. |
|
||||||
|
|
||||||
|
*Parâmetros especiais:*
|
||||||
|
|
||||||
|
| Identificador | Valor associado |
|
||||||
|
|---------------+----------------------------------------------------------|
|
||||||
|
| ~-~ | As opções de início do shell (na forma de caracteres) |
|
||||||
|
| ~$~ | O número do /processo/ do shell em execução. |
|
||||||
|
| ~?~ | O estado de término do último comando (sucesso ou erro). |
|
||||||
|
| ~!~ | O número do último processo executado em segundo plano. |
|
||||||
|
|
||||||
|
** O que são expansões de parâmetros
|
||||||
|
|
||||||
|
No shell, tanto variáveis quanto parâmetros são chamados de /parâmetros/ e seus
|
||||||
|
valores são acessados através do mecanismo da /expansão/, que é o nome dado
|
||||||
|
a qualquer troca de símbolos ou identificadores na linha do comando pelos
|
||||||
|
seus respectivos valores.
|
||||||
|
|
||||||
|
No caso de variáveis e parâmetros, a expansão é indicada para o shell com o
|
||||||
|
caractere ~$~ escrito no início do identificador:
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
$IDENTIFICADOR # Expande o valor associado a IDENTIFICADOR.
|
||||||
|
|
||||||
|
${IDENTIFICADOR} # Forma utilizada quando a expansão é modificada
|
||||||
|
# ou quando IDENTIFICADOR pode ser confundido com
|
||||||
|
# os caracteres seguintes na linha.
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
A coisa mais importante a saber sobre as expansões, é que elas são processadas
|
||||||
|
*antes* da linha do comando ser efetivamente executada. Portanto, no exemplo
|
||||||
|
abaixo...
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
:~$ fruta=bananas
|
||||||
|
:~$ echo Vou comprar $fruta.
|
||||||
|
Vou comprar bananas.
|
||||||
|
#+end_example
|
||||||
|
|
||||||
|
A variável ~fruta~ teve seu valor expandido antes do comando ~echo~ ser executado.
|
||||||
|
|
12
README.org
12
README.org
|
@ -28,4 +28,16 @@
|
||||||
|
|
||||||
- [[#][7. Agenda e tarefas (deafio final)]]
|
- [[#][7. Agenda e tarefas (deafio final)]]
|
||||||
|
|
||||||
|
* Material de apoio
|
||||||
|
|
||||||
|
** Vídeos
|
||||||
|
|
||||||
|
- [[https://www.youtube.com/playlist?list=PLXoSGejyuQGr53w4IzUzbPCqR4HPOHjAI][Curso intensivo de programação do Bash (recomendado)]]
|
||||||
|
- [[https://youtube.com/playlist?list=PLXoSGejyuQGqSs1iJ21gZI55Dj9nCpgVr&si=P8zSO60ekfCUjx4c][Curso Shell GNU/Linux ao vivo (para aprofundamento)]]
|
||||||
|
- [[https://youtube.com/playlist?list=PLXoSGejyuQGqJEEyo2fY3SA-QCKlF2rxO&si=m7Lg--Lu8vXIKQmb][Curso Shell GNU/Linux gravado (para aprofundamento)]]
|
||||||
|
|
||||||
|
** Texto
|
||||||
|
|
||||||
|
- [[https://blauaraujo.com/downloads/pmpgb.pdf][(PDF) Pequeno Manual do Programador GNU/Bash]]
|
||||||
|
- [[https://www.gnu.org/software/bash/manual/bash.html][(ONLINE) Manual oficial do GNU Bash]]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue