Vinícius Hansen

Um pouco de Shell Script

O que é Shell?

Shell é uma interface de interação usuário-computador, pode ser por interface gráfica ou linha de comando(terminal/cmd). A maioria dos Shells que são usados nos sistemas unix-like (entre eles linux e macOS) são uma “extensão” da POSIX Shell(sh), que é considerada a base do shell scripting. No Windows temos o PowerShell, mas esse não será abordado nesse post.

O que é Shell Script?

o Shell script é usado em grande parte para a automação ou facilitação de tarefas, no Shell script podemos combinar os comandos que já conhecemos do terminal e combiná-los com loops, variáveis, estruturas de if/else e interação com usuário.

Um exemplo da aplicação do Shell script

cd Blog_hugo
hugo -t contrast-hugo   #converte os arquivos .md em .html
cd public
git commit -a -m "update via script"
git push
cd ..
git commit -a -m "update via script"
git push

esse é o script que eu uso para atualizar esse blog, então em vez de rodar todos esses comandos “na mão” eu posso escrever eles em um arquivo e rodar esse arquivo, assim escrevo apenas um comando e não preciso lembrar do comando de “compilar” o blog.


Tipos de Shell

Os principais Shell nos sistemas unix-like atualmente são BASH, ZSH e FISH.

O BASH e o ZSH são POSIX compliant, ou seja, fazem tudo que o POSIX Shell faz e mais algumas coisas, como se fossem contruídas em sima do POSIX Shell, já o FISH não contém algumas funções do POSIX, por isso não é interessante rodar scripts pelo FISH.

Outro exemplo

#!/bin/bash

cat *.jpeg | ffmpeg -framerate 0.25 -f image2pipe -i - temp.mp4

ffmpeg -i temp.mp4 -i song.mp3  -c:a aac -strict experimental -pix_fmt yuv420p -shortest  video_script.mp4

rm temp.mp4

Esse script pega várias imagens de um formato específico em uma pasta e faz um video de imagens com música de fundo (aqueles videos que sua família pede pra você fazer todo natal).

Note que na primeira linha eu utilizei um Sha-Bang, onde eu indico o caminho do Shell que deve executar o script, assim eu posso escolher qual shell deve rodar o script.


Variáveis

Para fazer uma variável em Shell, podemos fazer o seguinte nome_variavel=valor, para chamar uma variável temos que usar $nome_variavel. Também é possível fazer uma variável de um output de um comando: NOME_VARIAVEL=$(comando)

Input do usuário

Pra guardar um input em uma variável:

echo -n "Escreva um nome: "
read nome

Mais algumas caracteristicas do Shell


Loops

Agora vou focar mais na sintaxe e explicação do funcionamento das estruturas do Shell Script.

While

while [ condição ]
do
    comandos
done

Until

Esse foi novidade pra mim, nunca vi em outras linguagens, mas é bem parecido com o while, a diferença é que o while é executado enquanto a condição for verdadeiro, enquanto o until é executado enquanto a condição for falsa.

until [ condição ]
do
    comandos
done

For

for variavel in lista
do
    comandos
done

Um exemplo de lista seria nomes = 'Vinícius João Paulo Fulano' onde os elementos são separados por um espaço.

Podemos usar ranges no lugar de listas, por exemplo {1..5} é 1 até 5, também podemos contar de n em n: {10..0..2} significa contar de 10 até 0 de 2 em 2.

Podemos usar arquivos também:

for value in $1/*.html
do
    cp $value $1/$( basename -s .html $value ).php
done

tradução:

para cada valor(variavel/ arquivo) em (todos os arquivos que terminam em .html nesse diretório), copie o valor(o arquivo) para um arquivo de mesmo nome, mas com final .php


if/else

O if/else não tem muito o que falar,mas note que para fechar a estrutura usamos seu nome invertido no final “fi”

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

case

O case também usa seu nome invertido para fechar a estrutura.

case variavel in
	caso_1 )
		comandos ;;
	caso_2 )
		comandos ;;
	caso_3 )
		comandos ;;
    *)
		comandos ;;
esac

Lembra do *?

Aqui ele serve como um default ou um else

case character in
    [a-z])
        echo "Small Alphabet." ;;
    [A-Z])
        echo "Big Alphabet." ;;
    [0-9])
        echo "Number." ;;
    *)
        echo "Special Character."
esac

Mais algumas coisas:


Escrito por Vinícius Hansen