BASH scripting para principiantes

Published:

Bourne-Again Shell (Bash)

Bash é um acrônimo para “Bourne-Again Shell”, o nome de um interpretador de código e uma linguagem de programação bastante usada em Química Computacional. Você pode usar o Bash em computadores com sistemas operacionais baseados em Linux/Unix ou até mesmo em computadores com Windows 10. Em um sistema operacional Linux, como o Ubuntu usado no LMSC, você deve procurar o aplicativo do terminal ou pressionar o atalho Control+Alt+T. Caso tenha o terminal do Ubuntu instalado em seu computador com Windows, pode acessá-lo da mesma forma que acessa outros programas no Windows.

Quando o terminal é aberto, o interpretador (shell) é inicializado. O seu computador roda arquivos de inicialização (.bashrc, .bash_profile etc) que permitem que tudo seja acessado e executado de forma simples. Usuários avançados podem modificar seus arquivos de inicialização de acordo com suas necessidades, mas esse é um tópico para tutoriais futuros.

Com a shell aberta, tudo que digitamos é interpretado e resulta em uma resposta. Se, por acaso, digitamos:

pwd

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, basta digitar:

ls

O resultado será uma lista de arquivos e pastas como o exemplo abaixo:

exemplo.txt
Documents
Downloads
Music
Pictures
Templates
Videos

Normalmente o terminal dá cores diferentes para distinguir pastas de arquivos. No caso acima, exemplo.txt é um arquivo e os demais membros da lista são pastas. Uma lista de comandos pode ser encontrada neste link, mas vale a pena ressaltar alguns mais frequentemente usados:

pwd        # mostra na tela o caminho para a pasta em que o usuário se encontra.
ls         # lista o conteúdo da pasta em que o usuário se encontra
cd         # permite trocar de pasta.

cd significa change directory e permite que o usuário entre em outra pasta. Por exemplo, se eu estiver em /home/guilherme e quiser ir para Documents eu digito no terminal

cd Documents

Caso exista uma pasta chamada Documents na pasta em que estou, a shell automaticamente me moverá para essa pasta. Isso pode ser confirmado usando o comando pwd, que deverá mostrar na tela /home/guilherme/Documents. Mais comandos:

mkdir       # Cria pasta nova
rm          # remove arquivos/pastas
cp          # copia arquivos/pastas
mv          # move a localização de arquivos e pastas, podendo mudar seus nomes
cat         # monstra o conteúdo de um arquivo na tela
touch       # cria arquivo em branco

Um tutorial completo de comandos no Unix pode ser encontrado neste link.

Tarefa 1

Faça os tutoriais 1, 2, 3 e 4 deste link e responda as perguntas. Escreve suas respostas no seu caderno de laboratório no Notion, uma ferramenta gratuita bastante útil para organizar dados e fazer anotações.

  • O que acontece se digitarmos mkdir trabalho no terminal? Há erro?
  • O que acontece se digitarmos touch trabalho/texto no terminal? Há erro?
  • O que acontece se digitarmos rm trabalho no terminal? Há erro?
  • O que acontece se digitarmos rm -r trabalho no terminal? Há erro?
  • Crie uma pasta com o seu nome. Como você faria isso?
  • Como posso entrar no diretório com seu nome?
  • Como posso voltar para o diretório-pai?
  • Como posso saber em que diretório estou trabalhando?
  • O que ocorre se digitar echo "Estou aprendendo bash" > arquivo? Teste sua hipótese digitando cat arquivo no terminal.

Script em bash

Um script em bash (ou bash script) é um arquivo de texto contendo uma série de instruções na linguagem bash. Você pode criar um script escrevendo o seguinte comando no terminal:

touch meu_primeiro_script.sh

Para abrir o arquivo recém criado, você pode usar o editor de texto que quiser. Eu gosto de usar o Vim, mas você pode usar o Atom, Nano, EMACS. Para conhecer mais comandos do Vim, acesse este link. Usando o seu editor de texto favorito, você deve adicionar a seguinte linha ao topo do arquivo:

#!/bin/sh

Esta linha sinaliza ao interpretador que o arquivo que a contém é um bash script. O script é rodado no terminal por meio do comando:

bash meu_primeiro_script.sh

Como o script que criamos não tem nada além da primeira linha, nada deve acontecer. Vamos modificá-lo. Usando o seu editor de texto favorito, certifique-se que seu script contenha as seguintes linhas:

#!/bin/sh

number=6
for ((i=0;i<${number};i++))
do
    echo "Hello world ${i}"
done

Por razões de compatibilidade, scripts normalmente são escritos com variáveis sem acentuação gráfica. Eu gosto de escrevê-los em inglês porque sou acostumado mas não é uma exigência. Apenas jamais use caracteres especiais da língua portuguesa em seu trabalho computacional.

Se você executar seu script digitando bash meu_primeiro_script.sh no terminal, a shell mostrará na sua tela as seguintes linhas:

Hello world 0
Hello world 1
Hello world 2
Hello world 3
Hello world 4
Hello world 5

O processo de imprimir a mesma frase seguida por um número é chamado de iteração e pode ser usado para fazer uma tarefa repetitiva. Copie e cole no terminal (não use control+c e control+v no Linux porque não funciona) as seguintes linhas:

cat <<EOF > lista_de_proteinas.txt
1EVE
1H22
1J07
1Q84
1ZGC
1EQG
1EQH
1HT5
1HT8
1Q4G
4COX
EOF

O comando acima cria um arquivo chamado lista_de_proteinas.txt em que cada linha entre o nome do arquivo (lista_de_proteinas.txt) e a linha EOF (end-of-file) estará no arquivo. Confirme digitando cat lista_de_proteinas.txt.

Para evitar processos repetidos, você pode usar iterações como a do script meu_primeiro_script.sh. Crie outro script chamado mostrar_proteinas.sh com os seguintes comandos:

#!/bin/sh

for line in $(cat lista_de_proteinas.txt)
do
    echo ${line}
done

Ao executar o script (bash mostrar_proteinas.sh), o terminal mostrará na tela:

1EVE
1H22
1J07
1Q84
1ZGC
1EQG
1EQH
1HT5
1HT8
1Q4G
4COX

Tudo num script que é iniciado com $ é uma referência a uma variável. No script meu_primeiro_script.sh, definimos number=6 e, em seguida escrevemos uma iteração que significa “para cada i inteiro, de i=0 até i<6”, escreva na tela Hello world e o valor de i”. Isso é equivalente à expressão ((i=0;i<${number};i++)). Da mesma forma, no script mostrar_proteinas.sh, o comando dado quer dizer que para cada linha (line) em lista_de_proteinas.txt o comando de mostrar na tela deve ser usado para mostrar cada linha (${line}). As chaves {} são usadas para evitar ambiguidades na leitura do código.

Tarefa 2

  • Escreva um pequeno script que leia lista_de_proteinas.txt e que imprima cada linha cinco vezes.