Atualização: 05/04/2019

Code-Style


IDENTAÇÃO: Tabulação de 4, convertido em espaços.

Sobre este Manual para Programadores

Este manual tem a visão de ajudar a esclarecer os futuros desenvolvedores do banana, assim criando um padrão a ser seguido! Por favor, leia todo este manual!

O que você, programador precisa saber!

O bananapkg desde o inicio segue uma conduta! Não se intitulamos um simples script/rotina e sim um programa. Para continuar a seguir esta conduta devemos levar em consideração que o algoritmo sempre deverá ser levado a sério e não como uma brincadeira.

Você deve levar em consideração que fazemos a manipulação da parte mais importante do sistema, os programas. Se algo der errado poderá quebrar o sistema do usuário todo! Como é o caso da parte de remoção dos pacotes.

Por isso a receita básica:

Variáveis

O conteúdo das variáveis devem sempre estar seguros entre aspas! Certifique-se de não esquecer. Se for simples strings onde não existe o uso de variáveis ou algum backslash, você pode usar somente aspas simples.

Como aspas duplas tem o poder de interpretar tudo que está dentro dela, é um pouco mais lento. Para string prefira aspas simples ''

#Errado
teste_do_pacote=$(echo 'Echo desnecessário')

#Correto
teste_do_pacote="$(echo 'Echo desnecessário')""
#Errado
testando="Só uma string qualquer"

#Correto
testando_de_novo='Só uma string qualquer'

O Comando Teste

O teste que utilizamos é do padrão Bash/KSH. Por o banana ser contruido em bash não tem o motivo para usar o teste padrão Bourne Shell.
O teste [[ ]] é muito mais poderoso e aceita por exemplo expressões regulares ;)

#ERRADO
[ -e "arquivo" ] && echo "Existe"

#CERTO
[[ -e "arquivo" ]] && echo "Existe"

Funções

As funções deverão iniciar com _ seguido de um nome BEM descritivo e em UPPERCASE. Também deverá ser em inglês. Utilize o function na frente para chamada.

#ERRADO
_count_chars()
{
	commands
}

#CERTO
function _COUNT_CHARS_ON_PACKAGE()
{
	commands
}

Utilize também variáveis somente locais nas funções, não podemos de maneira alguma sujar o ambiente do programa! Isso pode favorecer a falhas futuras.

#ERRADO
_CLEAR_DIR_TMP()
{
	# Variaveis
	v='$1'
	b='$2'
}

#CERTO
function _CLEAR_DIR_TMP()
{
	# Variaveis
	local v='$1'
	local b='$2'
}

Não use o cat

Ele faz parte do coreutils do GNU, porém como na grande maioria dos casos, tentamos não depender destas ferramentas.

Para isso fazemos a emulação... Para simular o comando cat podemos usar o loop while lendo linha a linha uma arquivo O loop while é builtin do próprio shell bash, deixando assim um pouco mais rápido.

Isso em ALGUNS casos e bem especificos. Na maioria das vezes é um pouco mais lento, porém podemos fazer uma manipulação melhor do documento, sem depender de outras ferramentas. Veja ainda nesta sessão.

$ time cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
......

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ time while IFS= read line; do echo "$line"; done < "/etc/passwd"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
.....

real	0m0.002s
user	0m0.001s
sys	0m0.000s

Normalmente se usaria a ferramenta grep para fazer uma pesquisa em um arquivo. É uma boa ferramenta mas em alguns casos podemos usar o loop while com o teste para fazer está brincadeira.

Como dito, não será tão rápido... Mas programação em Shell é isso! Tentar usar o máximo dos recursos builtin.
time grep '^slackjeff' /etc/passwd
slackjeff:x:1001:1002::/home/slackjeff:/bin/bash

real	0m0.006s
user	0m0.004s
sys	0m0.002s

time while IFS= read line; do
	[[ "$line" =~ ^slackjeff ]] && echo "$line"
done < "/etc/passwd"
slackjeff:x:1001:1002::/home/slackjeff:/bin/bash

real	0m0.002s
user	0m0.002s
sys	0m0.000s
#ERRADO
time echo "$1" | grep -qE '[[:space:]]+' && echo "tem espaço"
tem espaço

real	0m0.007s
user	0m0.006s
sys	0m0.002s

#CORRETO
time while read line; do
	[[ "$line" =~ [[:space:]]+ ]] && echo "Tem espaços."
done <<< "$1"
Tem espaços.

real	0m0.000s
user	0m0.000s
sys	0m0.000s

Isso é um exemplo bem básico, claro que alguns casos não tem como fugir... Mas evite.

Sed desnecessário

Em muitos códigos vemos o uso do sed desnecessário, sendo usado em coisas que poderiamos usar a expansão de variáveis.

Expansão de variáveis é builtin do próprio Shell e possui recursos bem avançados! Por exemplo supondo que precisamos converter toda string em maiusculo.

# ERRADO
up="oi tudo bem"
up="$(echo "$up" | sed 's/./\U&/g')"
OI TUDO BEM


#CERTO
up="oi tudo bem"
up=${up^^}
echo $up
OI TUDO BEM

VOLTAR