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/bash

shebang 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 DATA

O Bash tambem possui variáveis nativas. São elas:

  • $?: valor retornado pelo ultimo comando executado
  • $$: o PID do 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))   # => 2

Estrutura 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 ...
fi

Tambem podemos usar a seguinte notação:

#!/bin/bash
 
if [ "$NAME" == "Maria" ]; then
	# codigo ...
elif [ "$NAME" != "João" ]; then
	# codigo ... 
else
	# codigo ....
fi

Tambem 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 ....
fi

Arrays

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 4

FOR

A seguir, temos um exemplo de uso do for:

#!/bin/bash
 
for aluno in "${alunos[@]}"; do
	echo "$aluno"
done
 
# =>
# joao 
# maria 
# jose 
# ana

També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 ))
done

Se 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: