|
| 1 | + |
1 | 2 | --- |
2 | | -title: "Tutorial 1" |
3 | | -excerpt: "Tutorial de bash" |
| 3 | +title: "BASH scripting para principiantes" |
| 4 | +excerpt: "Tutorial de BASH scripting para alunos de iniciação científica e pós-graduação" |
4 | 5 | collection: portfolio |
5 | 6 | --- |
6 | 7 |
|
| 8 | +#Bash Scripting |
| 9 | +##Bourne-Again Shell (Bash) |
| 10 | +Bash é um acrônimo para “Bourne-Again Shell”, o nome de um interpretador de |
| 11 | +código e uma linguagem de programação bastante usada em Química Computacional. |
| 12 | +Você pode usar o Bash em computadores com sistemas operacionais baseados em |
| 13 | +Linux/Unix ou até mesmo em computadores com [Windows 10](https://apps.microsoft.com/store/detail/ubuntu-on-windows/9NBLGGH4MSV6?hl=pt-br&gl=BR). |
| 14 | +Em um sistema operacional Linux, como o Ubuntu usado no LMSC, você deve procurar |
| 15 | +o aplicativo do terminal ou pressionar o atalho `Control+Alt+T`. Caso tenha o |
| 16 | +terminal do Ubuntu instalado em seu computador com Windows, pode acessá-lo da |
| 17 | +mesma forma que acessa outros programas no Windows. |
| 18 | + |
| 19 | +Quando o terminal é aberto, o interpretador (`shell`) é inicializado. O seu |
| 20 | +computador roda arquivos de inicialização (`.bashrc`, `.bash_profile` etc) que |
| 21 | +permitem que tudo seja acessado e executado de forma simples. Usuários avançados |
| 22 | +podem modificar seus arquivos de inicialização de acordo com suas necessidades, |
| 23 | +mas esse é um tópico para tutoriais futuros. |
| 24 | + |
| 25 | +Com a `shell` aberta, tudo que digitamos é interpretado e resulta em uma |
| 26 | +resposta. Se, por acaso, digitamos: |
| 27 | +``` |
| 28 | +pwd |
| 29 | +``` |
| 30 | +a `shell` escreverá na tela um texto como `/home/guilherme`. Esse é chamado de caminho para a pasta onde você está trabalhando. Para ver o conteúdo da pasta, |
| 31 | +basta digitar: |
| 32 | +``` |
| 33 | +ls |
| 34 | +``` |
| 35 | +O resultado será uma lista de arquivos e pastas como o exemplo abaixo: |
| 36 | +``` |
| 37 | +exemplo.txt |
| 38 | +Documents |
| 39 | +Downloads |
| 40 | +Music |
| 41 | +Pictures |
| 42 | +Templates |
| 43 | +Videos |
| 44 | +``` |
| 45 | +Normalmente o terminal dá cores diferentes para distinguir pastas de arquivos. |
| 46 | +No caso acima, `exemplo.txt` é um arquivo e os demais membros da lista são |
| 47 | +pastas. Uma lista de comandos pode ser encontrada [neste link](http://ringo.ams.stonybrook.edu/index.php/Unix), |
| 48 | +mas vale a pena ressaltar alguns mais frequentemente usados: |
| 49 | +``` |
| 50 | +pwd # mostra na tela o caminho para a pasta em que o usuário se encontra. |
| 51 | +ls # lista o conteúdo da pasta em que o usuário se encontra |
| 52 | +cd # permite trocar de pasta. |
| 53 | +``` |
| 54 | +`cd` significa _change directory_ e permite que o usuário entre em outra pasta. |
| 55 | +Por exemplo, se eu estiver em `/home/guilherme` e quiser ir para `Documents` |
| 56 | +eu digito no terminal |
| 57 | +``` |
| 58 | +cd Documents |
| 59 | +``` |
| 60 | +Caso exista uma pasta chamada `Documents` na pasta em que estou, a `shell` |
| 61 | +automaticamente me moverá para essa pasta. Isso pode ser confirmado usando o |
| 62 | +comando `pwd`, que deverá mostrar na tela `/home/guilherme/Documents`. |
| 63 | +Mais comandos: |
| 64 | +``` |
| 65 | +mkdir # Cria pasta nova |
| 66 | +rm # remove arquivos/pastas |
| 67 | +cp # copia arquivos/pastas |
| 68 | +mv # move a localização de arquivos e pastas, podendo mudar seus nomes |
| 69 | +cat # monstra o conteúdo de um arquivo na tela |
| 70 | +touch # cria arquivo em branco |
| 71 | +``` |
| 72 | +Um tutorial completo de comandos no Unix pode ser encontrado [neste link](http://www.ee.surrey.ac.uk/Teaching/Unix/). |
| 73 | + |
| 74 | +### Tarefa 1 |
| 75 | +Faça os tutoriais 1, 2, 3 e 4 [deste link](http://www.ee.surrey.ac.uk/Teaching/Unix/unix1.html) |
| 76 | +e responda as perguntas. Escreve suas respostas no seu caderno de laboratório no |
| 77 | +[Notion](https://www.notion.so), uma ferramenta gratuita bastante útil para organizar dados e |
| 78 | +fazer anotações. |
| 79 | + |
| 80 | +* O que acontece se digitarmos `mkdir trabalho` no terminal? Há erro? |
| 81 | +* O que acontece se digitarmos `touch trabalho/texto` no terminal? Há erro? |
| 82 | +* O que acontece se digitarmos `rm trabalho` no terminal? Há erro? |
| 83 | +* O que acontece se digitarmos `rm -r trabalho` no terminal? Há erro? |
| 84 | +* Crie uma pasta com o seu nome. Como você faria isso? |
| 85 | +* Como posso entrar no diretório com seu nome? |
| 86 | +* Como posso voltar para o diretório-pai? |
| 87 | +* Como posso saber em que diretório estou trabalhando? |
| 88 | +* O que ocorre se digitar `echo "Estou aprendendo bash" > arquivo`? Teste sua |
| 89 | +hipótese digitando `cat arquivo` no terminal. |
| 90 | + |
| 91 | +## Script em bash |
| 92 | +Um script em bash (ou bash script) é um arquivo de texto contendo uma série de |
| 93 | +instruções na linguagem bash. Você pode criar um script escrevendo o seguinte |
| 94 | +comando no terminal: |
| 95 | +``` |
| 96 | +touch meu_primeiro_script.sh |
| 97 | +``` |
| 98 | +Para abrir o arquivo recém criado, você pode usar o editor de texto que quiser. |
| 99 | +Eu gosto de usar o `Vim`, mas você pode usar o [`Atom`](https://atom.io), `Nano`, `EMACS`. Para |
| 100 | +conhecer mais comandos do `Vim`, acesse [este link](http://ringo.ams.stonybrook.edu/index.php/Vi). |
| 101 | +Usando o seu editor de texto favorito, você deve adicionar a seguinte linha ao |
| 102 | +topo do arquivo: |
| 103 | +``` |
| 104 | +#!/bin/sh |
| 105 | +``` |
| 106 | +Esta linha sinaliza ao interpretador que o arquivo que a contém é um bash script. |
| 107 | +O script é rodado no terminal por meio do comando: |
| 108 | +``` |
| 109 | +bash meu_primeiro_script.sh |
| 110 | +``` |
| 111 | +Como o script que criamos não tem nada além da primeira linha, nada deve acontecer. |
| 112 | +Vamos modificá-lo. Usando o seu editor de texto favorito, certifique-se que seu |
| 113 | +script contenha as seguintes linhas: |
| 114 | +``` |
| 115 | +#!/bin/sh |
| 116 | +
|
| 117 | +number=6 |
| 118 | +for ((i=0;i<${number};i++)) |
| 119 | +do |
| 120 | + echo "Hello world ${i}" |
| 121 | +done |
| 122 | +``` |
| 123 | +Por razões de compatibilidade, scripts normalmente são escritos com variáveis |
| 124 | +sem acentuação gráfica. Eu gosto de escrevê-los em inglês porque sou acostumado |
| 125 | +mas não é uma exigência. Apenas jamais use caracteres especiais da língua |
| 126 | +portuguesa em seu trabalho computacional. |
| 127 | + |
| 128 | +Se você executar seu script digitando `bash meu_primeiro_script.sh` no terminal, |
| 129 | +a `shell` mostrará na sua tela as seguintes linhas: |
| 130 | +``` |
| 131 | +Hello world 0 |
| 132 | +Hello world 1 |
| 133 | +Hello world 2 |
| 134 | +Hello world 3 |
| 135 | +Hello world 4 |
| 136 | +Hello world 5 |
| 137 | +``` |
| 138 | + |
| 139 | +O processo de imprimir a mesma frase seguida por um número é chamado de iteração |
| 140 | +e pode ser usado para fazer uma tarefa repetitiva. Copie e cole no terminal (não |
| 141 | +use `control+c` e `control+v` no Linux porque não funciona) as seguintes linhas: |
| 142 | +``` |
| 143 | +cat <<EOF > lista_de_proteinas.txt |
| 144 | +1EVE |
| 145 | +1H22 |
| 146 | +1J07 |
| 147 | +1Q84 |
| 148 | +1ZGC |
| 149 | +1EQG |
| 150 | +1EQH |
| 151 | +1HT5 |
| 152 | +1HT8 |
| 153 | +1Q4G |
| 154 | +4COX |
| 155 | +EOF |
| 156 | +``` |
| 157 | +O comando acima cria um arquivo chamado `lista_de_proteinas.txt` em que cada |
| 158 | +linha entre o nome do arquivo (`lista_de_proteinas.txt`) e a linha `EOF` (end-of-file) |
| 159 | +estará no arquivo. Confirme digitando `cat lista_de_proteinas.txt`. |
| 160 | + |
| 161 | +Para evitar processos repetidos, você pode usar iterações como a do script |
| 162 | +`meu_primeiro_script.sh`. Crie outro script chamado `mostrar_proteinas.sh` com |
| 163 | +os seguintes comandos: |
| 164 | +``` |
| 165 | +#!/bin/sh |
| 166 | +
|
| 167 | +for line in $(cat lista_de_proteinas.txt) |
| 168 | +do |
| 169 | + echo ${line} |
| 170 | +done |
| 171 | +``` |
| 172 | +Ao executar o script (`bash mostrar_proteinas.sh`), o terminal mostrará na tela: |
| 173 | +``` |
| 174 | +1EVE |
| 175 | +1H22 |
| 176 | +1J07 |
| 177 | +1Q84 |
| 178 | +1ZGC |
| 179 | +1EQG |
| 180 | +1EQH |
| 181 | +1HT5 |
| 182 | +1HT8 |
| 183 | +1Q4G |
| 184 | +4COX |
| 185 | +``` |
| 186 | +Tudo num script que é iniciado com `$` é uma referência a uma variável. No script |
| 187 | +`meu_primeiro_script.sh`, definimos `number=6` e, em seguida escrevemos uma |
| 188 | +iteração que significa "para cada `i` inteiro, de i=0 até i<6", escreva na tela |
| 189 | +`Hello world` e o valor de `i`". Isso é equivalente à expressão `((i=0;i<${number};i++))`. |
| 190 | +Da mesma forma, no script `mostrar_proteinas.sh`, o comando dado quer dizer que |
| 191 | +para cada linha (`line`) em `lista_de_proteinas.txt` o comando de mostrar na tela |
| 192 | +deve ser usado para mostrar cada linha (`${line}`). As chaves `{}` são usadas |
| 193 | +para evitar ambiguidades na leitura do código. |
| 194 | + |
| 195 | +### Tarefa 2 |
| 196 | + |
| 197 | +* Escreva um pequeno script que leia `lista_de_proteinas.txt` e que imprima cada |
| 198 | +linha cinco vezes. |
0 commit comments