IDENTAÇÃO: Tabulação de 4, convertido em espaços.
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 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:
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 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"
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' }
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.
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