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)
Pra guardar um input em uma variável:
echo -n "Escreva um nome: "
read nome
Mais algumas caracteristicas do Shell
*
é um caracter especial que significa “tudo”.cat *.jpeg
significa “pegue tudo que termina com .jpeg”(o comando cat é usado geralmente para printar um arquivo ou concatenar 2 arquivos e printar o resultado no terminal).- Também podemos usar o pipe
|
para passar o output do comando para o input de outro: cat *.jpeg | ffmpeg image2pipe -i - video.mp4
, aqui eu pego as imagens que selecionei com o camando cat e passo para o ffmpeg
para fazer um vídeo. - Para mandar o output de um comando para um arquivo, usamos o
>
, se usarmos o >
mais de uma vez ele vai sobreescrever o arquivo, para adicionar mais texto sem sobreescrever usamos o >>
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:
- Também temos
break
e continue
, mas eles funcionam igual ao C, se quiser saber mais leia o post de C - Podemos usar a estrutura
select
para criar um menu para o script, mas ainda não vi muita utilidade nisso, caso queira saber mais leia esse artigo - Para tornar um script executável em sistemas unix-like use
chmod +x nome_arquivo
- Para rodar o script direto no terminal, adicione um
Sha-Bang
, tire o .sh
do final do nome e mova o arquivo para /usr/local/bin/
, agora escreva o nome do script no terminal e ele será executado. - Para um maior aprofundamento (em inglês) clique aqui
Escrito por Vinícius Hansen