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