Home Shell Scripting
Post
Cancel

Shell Scripting


Artigo ainda em construção, releve os erros. Talvez algumas informações estejam incompletas

Arquivos .sh

Exitem diversos shells, alguns exemplos são sh, fish, zsh, tcsh, cada um com suas peculiaridades, porém o mais difundido é o bash. Esse será a base para os conhecimentos compartilhados nesse artigo.

No inicio de um arquivo .sh é comum adicionarmos um comentário chamado de “shabang” para dizermos qual interpretador shell deve executar o programa

1
#!/bin/bash

Um exemplo utilizando outro shell

1
#!/bin/fish

Ao criar um programa .sh precisamos dar permissão de execução do sistema. No Linux fazemos isso com chmod

1
$ chmod +x file.sh

Parâmetro +x adiciona permissão de execução do sistema ao arquivo.

Da mesma forma que a primeira linha comentada do programa diz qual shell deve executar o arquivo, é possível passar essa informação diretamente por linha de comando. Exemplo:

1
$ bash ./file.sh

Dessa forma, você força qual shell irá executar o programa o arquivo não precisará ter permissão de execução, evitando assim adicionar esse atributo com chmod +x

VARIÁVEIS

Exemplos:

ENV PATH HOME USERNAME TERM RANDOM

Array de ambiente

1
testearray=(laranja maça morango)
1
echo ${testearray[n]}

Arquivo de configuração

1
./bashrc

Aqui você pode configurar seu terminal, criando alias, variáveis e funções por exemplo:

1
2
3
4
5
6
# No final do arquivo, adicionei uma função que criar um diretório e entra no mesmo

function mkcd() {
	mkdir -p $1
	cd $1
}

Cálculos matemáticos

Sintaxe para receber valores matemáticos:

1
var=$[ operação ]
1
2
3
var1=$[ 3 + 6 ]

echo $var1 # output: 9
Exemplo que faz um pull em cada para repositório em uma pasta
1
2
3
4
5
6
7
8
9
10
11
12
13
#... abreviado

cd "$gitDir"
numLines="$(find . -type d  -maxdepth 1 | wc -l)"
counter=1

for archive in `find $gitDir -mindepth 1 -maxdepth 1 -type d`
do
#... abreviado
counter=$((counter+1))
percent=$(($counter*100/$numLines)) # Aqui executa a conta de porcentagem. Quantos repositórios já foram atualizados
echo -e "\033[032m[$percent%] Completo\033[m\n"

Outra opção é usar o programa bc

Condicional

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if comando
then
	comandos
fi

#ou

if comando; then
	comandos
else
	comandos
fi



if comando1; then
	comandos
elif comando2
then
	comandos processameto
elif comando3; then
	comandos processamento
fi

1
2
3
4
5
6
7
8
9
#!/bin/bash

file=$HOME/.bashrc
if [ $USER = daniel ] && [ -w file ]
then
	echo "$USER tem permição para alterar aquivo $file"
else
	echo "$USER não pode alterar $file"
fi

Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if test CONDIÇÃO
then
	comandos
fi

# ou

if [ CONDIÇÃO ]
then
	comandos
fi

# Exemplo

test 1 = 1; echo $?
#output 0

Parâmetros para comparação que podem ser usados com if e/ou test

Referência https://www.vivaolinux.com.br/dica/Conhecendo-o-test

  • -b arquivo - Verdadeiro se o arquivo é um block device
  • -c arquivo - Verdadeiro se o arquivo é um character device.
  • -d arquivo - Verdadeiro se o arquivo é um diretório.
  • -e arquivo - Verdadeiro se o arquivo existe.
  • f1 -ef f2 - (equivalent file) Verdadeiro se o arquivo f1 é um hard-link para f2.
  • n1 -eq n2 - (equal) Verdadeiro se n1 for igual a n2.
  • -f arquivo - Verdadeiro se o arquivo existe e é um arquivo regular.
  • n1 -ge n2 - (greater than or equal) Verdadeiro se n1 maior ou igual a n2.
  • n1 -gt n2 - (greater than) Verdadeiro se n1 for maior que n2.
  • -g arquivo - Verdadeiro se o SGID estiver ativado.
  • -G file - Verdadeiro se o arquivo (efetivamente) pertencer ao grupo sob qual o script estiver rodando.
  • -h arquivo - Verdadeiro de o arquivo for um link simbólico. -k arquivo - Verdadeiro se o arquivo tiver a permissão sticky bit ativada.
  • n1 -le n2 - (less than or equal) Verdadeiro se n1 menor ou igual a n2.
  • n1 -lt n2 - (less than) Verdadeiro se n1 menor que n2.
  • -n s (or just s)-(not null) Verdadeiro se a string não for vazia ou nula.
  • -N arquivo - Verdadeiro se o arquivo tiver novo conteúdo (desde a última vez que foi lido).
  • n1 -ne n2 - (not equal) Verdadeiro se n1 não for igual a n2.
  • -O file - Verdadeiro se o arquivo pertencer ao usuário sob o qual o script estiver rodando.
  • f1 -nt f2 (newer than) Verdadeiro se o arquivo f1 for mais recente que f1.
  • f1 -ot f2 (older than) Verdadeiro se o arquivo f1 for mais antigo que f1.
  • -p file - Verdadeiro se o arquivo for um pipe.
  • -r file - Verdadeiro se um arquivo for lido (pelo seu script).
  • -s arquivo - Verdadeiro se o arquivo existe e não estiver vazio.
  • -S arquivo - Verdadeiro se o arquivo for um socket.
  • -t fd - Verdadeiro se o descritor do arquivo estiver aberto em um terminal.
  • -u arquivo - Verdadeiro se o arquivo tiver set-user-id (suid) ativada.
  • -w arquivo - Verdadeiro se o arquivo tiver permissão de escrita (pelo seu script).
  • -x arquivo - Verdadeiro se o arquivo for executável.
  • -z s - (zero length) Verdadeiro se a string for igual a zero ou não possuir nenhum valor atribuído. Ex. variável nula ou arquivo vazio.

Outros operadores mais comuns

  • s1 = s2 - Verdadeiro se a string s1 é igual a s2.
  • s1 != s2 - Verdadeiro se a string s1 for diferente de s2.
  • s1 < s2 - Verdadeiro se a string s1 for menor que s2.
  • s1 > s2 - Verdadeiro se a string s1 for maior que s2.

Pode-se usar a palavra test para testar um comando,

  • OBS: O comando test não suporta números float

Todas essas informações podem ser encontradas com o comando man bash e pesquisar esses operadores digitando / e digitando CONDITIONAL EXPRESSIONS

Exemplos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

n1=10
n2=12

if test $n1 -eq $n2
then
     echo "$n1 = $n2"
elif [ $n1 -gt $n2 ]; then
	echo "$n1 > $n2"
elif [ $n1 -lt $n2 ]
then
    echo "$n1 < $n2"
else
    echo "erro"
fi

Comparação de arquivos no comando teste

1
2
test -f ~/.bashrc ; echo $?
#output: 0

Comando case

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

case <variavel> in
	valor)
		comando1;;
	valor2)
		comandos2;;
	*)
		comandos-padrão;;
esac

Estrutura de repetição

for, while, until

1
2
3
4
for valor in lista
do
	comandos
done

exemplo

1
2
3
4
5
6
7
8
9
10
11
 #!/bin/zsh

lista=("Laranja" Maçã mamão morango "leite condensado")
n=1

for item in $lista
do
    echo $n " - " $item
    n=$[ $n + 1 ] #ou n=$(($n+1))
done

for estilo C

1
2
3
4
5
6
7
8
9
10
11
for ((i = 0; i < $n; i++))
do
	# processamento
done

#também é possível usar wildcards (caracteres curingas) para criar um for

for i in {1..10}; do
	echo $i
done

Loop com until

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo "loop com until"

counter=0
until [ $counter -gt 5 ] # o loop executa então não satisfaze a condição
do
  echo "Count: $counter"
  ((counter++))
done

echo "loop com while"
#no mesmo funcionamento com while
counter=0

while [ $counter -le 5 ]; do
	echo "Count: $counter"
	((counter++))
done

Para efeito de demostração, um código fish shell que funcione da mesma forma que o código anterior

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/fish

set counter 0
while ! [ $counter -gt 5 ]
  echo "Count: $counter"
  set counter (math $counter + 1)
end

echo -e "\n"

set counter 0

while [ $counter -le 5 ];
	echo "Count: $counter"
	set counter (math $counter + 1 )
end

Parâmetros de linha de comando

./ex.sh param1 param2 …. $0 $1 $2

$# - numero de parametros

Shift

reduz ou passa o parametro para uma variável anterior, ex, valor de $3 passa para => $2

Comando read
1
2
read nome -p "nome: "
echo $nome

whiptail

Caixa de dialogo

1
whiptail --title "Caixa" --msgbox "caixa" --fb 10 50

funções

1
2
3
4
5
6
7
8
9
10
function nome_função {
	comandos
}

#ou

nome_funcao(){
	comandos
}

Recomendações

English

Português

O que é Shell? (Software) - Diolinux Explica Curso de Shell Scripting - Programação no Linux 30 Comandos do Terminal Linux BÁSICOS

This post is licensed under CC BY 4.0 by the author.