Embora muita das veze utilizados juntos, os termos shell e bash não são a mesma coisa.
O termo shell refere-se a um programa que fornece uma interface de linha de comando para interagir com o Sistema Operacional.
O termo Bash (Bourne-Again Shell)é um dos Unix/Linux shells mais comuns e utilizados.
flowchart LR
User --> Shell --> Kernel --> Hardware
Todo script bash possui a extensão .sh e possui ashebang (#!) na primeira linha do script.
#!/bin/bashshebang indica qual shell sera utilizado para executar o script.
Variáveis
As variáveis não devem possuir espaço entre o nome da variável, o simbolo de atribuição e o seu valor.
#!/bin/bash
# errado
NAME ="Maria"
NAME= "Maria"
# correto
NAME="Maria"
# sempre usar aspas duplas
echo "$NAME"Também é possível realizar a expansão da variável:
#!/bin/bash
echo "${NAME}" # Maria
# tamanho do conteudo da variavel
echo "${#NAME}" # 5É sempre uma boa ideia usar aspas “aspas” ao redor das variáveis para manter os espaços em branco e evitar problemas com variáveis vazias.
Todas as variáveis são consideradas globais. Variáveis locais são precedidas por local.
É possível armazenar o valor de um comando dentro de uma variável, inserindo o comando entre $(...).
#!/bin/bash
DATA=$(date)
echo "Data de Hoje: $DATA"
# o comando 'unset' apaga o conteudo da variavel
unset DATAO Bash tambem possui variáveis nativas. São elas:
$?: valor retornado pelo ultimo comando executado$$: oPIDdo script$0: o nome do script$1,$2…$9: argumentos que foram passados para o script, na sua execução$@: todos os argumentos fornecidos ao script$#: numero de argumentos fornecidas ao script
Expressões Aritméticas
Podemos utilizar a expressão $((...)) para realizar operações matemáticas:
#!/bin/bash
echo $((1 + 1)) # => 2Estrutura de controle, arrays e loops
Comando test
O comando test do shell permite vários tipos de testes muito uteis com valores numéricos, strings e arquivos. Temos os seguintes operadores para o test:
Números
-ne: not equal (diferente)-lt: less than (menor que)-gt: greater than (maior que)-le: less than or equal to (menor ou igual que)-ge: greater than or equal to (maior ou igual que)-eq: equal (igual a)
Strings
==: string é igual!=: string é diferente-n: string é não nula-z: string nula ou vazia
Arquivos
-d: é um diretório-f: é um arquivo comum-r: o arquivo tem permissão de leitura-w: o arquivo tem permissão de escrita-s: o tamanho do arquivo é maior que zero (arquivo não vazio)
Ainda existem outros operadores para arquivos, porém esses são os mais usados.
IF
Aqui podemos utilizar if como em outras linguagens. O if possui a seguinte estrutura:
#!/bin/bash
if test "$NAME" == "Maria"; then
# codigo ...
elif test "$NAME" != "João"; then
# codigo ...
else
# codigo ...
fiTambem podemos usar a seguinte notação:
#!/bin/bash
if [ "$NAME" == "Maria" ]; then
# codigo ...
elif [ "$NAME" != "João" ]; then
# codigo ...
else
# codigo ....
fiTambem temos operadores logicos que podem ser usados em duas ou mais condições:
&&: operador AND||: operador OR
#!/bin/bash
if [ "$NAME" == "Maria" ] || [ "$NAME" == "João" ]; then
# codigo ...
else
# codigo ....
fiArrays
A criação de um array segue a seguinte sintaxe:
alunos=("joao" "maria" "jose" "ana")Conseguimos acessar cada item do array através de indices, como em outras linguagens:
#!/bin/bash
# primeiro item do array: joao
echo "${alunos[0]}"
# todos os items do array: joao maria jose ana
echo "${alunos[@]}"
# numero de items no array: 4
echo "${#alunos[@]}"O comando seq ou {inicio .. fim} pode ser muito util se desejamos gerar uma sequência numérica:
#!/bin/bash
echo "$(seq 5)" # 0 1 2 3 4
echo {1..5} # 0 1 2 3 4FOR
A seguir, temos um exemplo de uso do for:
#!/bin/bash
for aluno in "${alunos[@]}"; do
echo "$aluno"
done
# =>
# joao
# maria
# jose
# anaTambém podemos utilizar uma notação alternativa para o for:
# numero de alunos
len=${#alunos[@]}
for ((i=0; i < len; i++)); do
echo "$alunos[i]"
done
# =>
# joao
# maria
# jose
# ana
WHILE
Exemplo de uso do while:
#!/bin/bash
count = 0
while test "$count" -lt 10 ; do
echo "$count"
$(( count += 1 ))
done
# ou, utilizando outra notação
while [ "$count" -lt 10 ]; do
echo "$count"
$(( count += 1 ))
doneSe desejamos sair do while, sem concluir sua condição, podemos usar o comando brake.
#!/bin/bash
while; do
if test -f /tmp/lock; then
echo "Aguardando liberação do lock..."
sleep 1
else
break
fi
done
Referências: