Shell-Base 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. #!/usr/bin/env bash
  2. # Template orgulhosamente criado por (Shell-Base)
  3. #-----------HEADER-----------------------------------------------------------------|
  4. #AUTOR
  5. # Jefferson Rocha <lrcjefferson@gmail.com>
  6. #
  7. #PROGRAMA
  8. # Shell-Base
  9. #
  10. #PEQUENA-DESCRIÇÃO
  11. # Programa para criação de template, deixe tudo organizado como deve ser!
  12. # Seus programas serão mais profissionais com o Shell-Base
  13. #
  14. #LICENÇA
  15. # MIT
  16. #
  17. #HOMEPAGE
  18. # https://slackjeff.github.io
  19. #
  20. #CHANGELOG
  21. #
  22. #----------------------------------------------------------------------------------|
  23. #------VARS--------->
  24. template="template."
  25. # Colorindo a sua vida.
  26. fecha="\033[m"
  27. verde="\033[32;1m"
  28. vermelho="\033[31;1m"
  29. branco="\033[37;1m"
  30. #-------------------->
  31. #------FUNCTIONS----------->
  32. dicas(){
  33. clear
  34. cat | less << EOF
  35. INFORMAÇÃO
  36. Você sabe o poder do Shell? espero que sim! Vou te passar algumas dicas valiosas
  37. para deixar seu programa com um grande diferencial, afinal queremos criar programas
  38. e não scripts não é? scripts são descartáveis... Programas não.
  39. VÁRIAVEIS DENTRO DE FUNÇÕES
  40. Quando você cria uma váriavel dentro de uma função utilize sempre local na frente,
  41. você não quer sujar o sistema do usuário não é?
  42. Utilizando o local na frente da váriavel, como o próprio nome sugere, vocẽ cria uma
  43. váriavel local, o que é mais correto de se fazer! exemplos:
  44. variavel=\$(printf %s "oi tudo bem?\n") ERRADO
  45. local variavel=\$(printf %s "oi tudo bem?\n") CORRETO
  46. ECHO OU PRINTF?
  47. Prefira utilizar printf ao invés do echo!
  48. Vários testes foram feitos e todos eles apontaram que o printf é mais leve
  49. que o echo.
  50. O echo tem vários parâmetros que não são portáveis para outros dialetos do shell.
  51. Então prefira e se acostume com o printf! ele é mais simples, poderoso e portável para
  52. Todos os dialetos do Shell.
  53. echo -e "\033[31;1m OLÁ MUNDO! \033[m" ERRADO
  54. printf %b "\033[31;1m OLÁ MUNDO! \033[m" CORRETO
  55. NÃO USE PRINTF OU ECHO DESNECESSÁRIOS!
  56. É de costume que muitos programadores usem echo e printf desnecessários!
  57. Por exemplo para criar um simples menu, 10 echo antes e 10 echo depois para
  58. deixar o script bem alinhado!
  59. Isso é correto? sim... Se funciona não tem como dizer que é errado, porem é bom
  60. sempre criar programas mais profissionais, principalmente quando você disponibiliza
  61. na internet!
  62. Sempre use a boa prática e não faça nada na base do facão.
  63. Sabemos que Shell e perfomace já não andam juntos! então prefira
  64. não deixar seu programa mais lento.
  65. MANEIRA LENTA
  66. echo
  67. echo
  68. echo "-----------------------------------------------------------"
  69. echo "OI TUDO BEM?"
  70. echo "Este é meu programa que faz alguma coisa!"
  71. echo "Este monte de echo, não sei por que estou usando."
  72. echo "Achei bonito e resolvi fazer um cabeçalho para meu programa"
  73. echo "Desta forma!"
  74. echo "-----------------------------------------------------------"
  75. echo
  76. echo
  77. OPÇÕES MAIS RÁPIDAS
  78. printf %b \\
  79. "\n\n\nOI TUDO BEM?
  80. Este é meu programa que faz alguma coisa!
  81. Agora com certeza estou deixando meu programa um pouco mais leve
  82. Não estou usando echo ou printf desnecessários!\n\n\n"
  83. cat << FECHA
  84. OI TUDO BEM?
  85. Este é meu programa que faz alguma coisa!
  86. Agora com certeza estou deixando meu programa um pouco mais leve
  87. Não estou usando echo ou printf desnecessários!
  88. FECHA
  89. ESTÁ EM DÚVIDA? USE ASPAS.
  90. Em Shell tudo é strings, prefira sempre usar aspas em tudo.
  91. Além de aspas proteger sua string caso ela esteja nula, ficará mais agradavel
  92. e mais profissional desta forma!
  93. Mas tome cuidado, alguns retornos de algumas váriaveis de ambiente podem
  94. ser alteradas! como por exemplo a váriavel de ambiente $*
  95. Sem aspas ela criar uma string em uma única linha, caso você use
  96. aspas ela muda o seu retorno!
  97. var="Aqui tem string e número 1991"
  98. var="Jefferson"
  99. var="1991"
  100. var="Uma string"
  101. case "\$UID" in 1000) printf %b "OI?\n"; esac
  102. for list in "arq1" "arq2" "arq3" "slackjeff the power"; do printf "\$list\n"; done
  103. "\$?"
  104. COMENTÁRIOS SÃO IMPORTANTES!
  105. Ao contrário que muita gente fala, comentários são extremamentes importantes!
  106. Não faça declarações de amor, ou falando mau do seu programa ou do mundo em geral!
  107. Sim, eu sei que as vezes ficamos com ráiva por que um certo trecho de código não está
  108. funcionando, faz parte e lide com isso.
  109. Comentários são de extrema importância, pois assim estamos cooperando para outros programadores
  110. mais leigos!
  111. Eles conseguiram ler com mais facilidade um bloco de código, quando ele está comentado!
  112. Faça sempre comentários nas linhas de códigos mais "complicadas" isto por exemplo não
  113. é tão certo:
  114. # Bloca que verifica se o usuário é root
  115. # se for root ele imprimi uma mensagem para
  116. # o usuário.
  117. # Se não for root o programa continua!
  118. if test "\$UID" -eq "0"; then
  119. printf "Rooot? não."
  120. fi
  121. Você não está falando para crianças do prezinho! você está falando com outros programadores.
  122. Quem for ler o seu código, sabe o que quer! Mesmo que sejam programadores que estão récem aprendendo
  123. Eles não são incopetentes a ponto de não saber o que um bloco simples deste faz!
  124. Caso prefira comentar, faça algo simples e direto:
  125. # É root?
  126. if test "\$UID" -eq "0"; then
  127. printf "Rooot? não."
  128. fi
  129. # Dialog está instalado?
  130. if ! type -P dialog; then
  131. printf %b "Parece que o dialog não está no seu sistema."
  132. fi
  133. Percebeu que comentado fica mais fácil compreender? e eu precisei especificar o que todo o bloco faz?
  134. Um simples comentário indo direto ao ponto já fica bem melhor a compreensão!
  135. Por exemplo, muitas pessoas não sabem que com o comando type podemos verificar se o programa X está instalado
  136. no sistema...
  137. Ahh, já que entramos no assunto, o comando type é portavel para outros dialetos do Shell!
  138. ao contrário do comando which.
  139. Caso você irá fazer uma maior explicação do que aquele bloco de código faz, use o bloco de comentários,
  140. por exemplo:
  141. # BUG
  142. # Nesta parte do código não estou conseguindo
  143. # resolver a questão do status de sáida!
  144. # Ele retorna status 0, quando era para estar
  145. # retornando status 1.
  146. Se for um pequeno comentário, prefira usar comentários de meia linha.
  147. > "arquivo.\$log" # Criando log temporário.
  148. Ou comentários do tipo cabeçalho.
  149. # Criando log temporário.
  150. > "arquivo.\$log"
  151. && || NÃO SUBSTITUI IF E ELSE
  152. Operadores lógicos AND e OR não são blocos condicionais if e else!
  153. Tudo bem acontece que o && só executa o próximo comando se o primeiro comando retornar
  154. status de sáida 0.
  155. E o || é executado caso o primeiro comando retornar um status diferente de 0.
  156. Utilize sempre operadores lógicos quando precisar verifcar um status por exemplo, que pode ser criado
  157. em uma única linha, mas não abuse, prefira sempre blocos condicionais completos!
  158. Ok, seu código irá ficar mais grande, mas use a boa prática sempre!
  159. Dê uma conferida em programas de programadores avançados em Shell...
  160. Dificilmente você verá blocos de Operadores lógicos substituindo if/else.
  161. Condicional com and e not
  162. [[ "\$name" = "Slackjeff" ]] && shutdown -r now || printf "Usuário $name, não encontrado no sistema.\n."
  163. ou
  164. [[ "\$name" = "Slackjeff" ]] && \ \
  165. shutdown -r now
  166. || \\
  167. printf "Usuário $name, não encontrado no sistema.\nVocê não tem permissão\n."
  168. Bloco condicional completo, if/else
  169. if [[ "\$name" = "Slackjeff" ]]; then
  170. shutdown -r now
  171. else
  172. printf "Usuário $name, não encontrado no sistema.\nVocê não tem permissão\n."
  173. fi
  174. USE AWK COM MODERAÇÃO!
  175. awk sem dúvidas é uma linguagem de manipulação de texto muito potente!
  176. Integrada com sed, que é outra linguagem muito potente, você faz tudo, o que uma não faz
  177. a outra com certeza irá fazer.
  178. Mas use com cuidado a linguagem awk, ela é pesada e com certeza irá deixar seus programas mais
  179. pesados.
  180. Para substituir o awk você pode utilizar as ferramentas básicas que está presente em qualquer distribuição
  181. GNU/Linux.
  182. sed
  183. grep
  184. cut
  185. OH MY READ
  186. Programas com interação com o usuário é muito importante e legal!
  187. Para isto usamos o comando read, ele faz a leitura do stdin (teclado).
  188. Mas a partir de agora você vai começar a reparar como os programadores o fazem!
  189. Vamos a alguns exemplos:
  190. printf %s "Qual é o diretorio que você deseja salvar o arquivo?"
  191. read dir_save
  192. O código acima pode simplesmente ser substituido assim, economizando uma linha e um printf:
  193. read -p "Qual é o diretorio que você deseja salvar o arquivo?" dir_save
  194. Legal! mas eu quero colorir o o texto do read, como faço? simples utilize $'', basicamente você está
  195. protegendo sua string mas interpreta \n, \t, \a etc... diferente das aspas simples '' sozinha.
  196. read -p $'\033[34;1mQual é o diretorio que você deseja salvar o arquivo?\033[m\n' dir_save
  197. Um problema que vejo é ter 50 read fazendo um formulario, por exemplo supondo que eu quero fazer várias
  198. perguntas para meu usuário, como eu faço?
  199. read -p "Qual a sua idade?" idade
  200. read -p "Cor favorita?" cor
  201. read -p "Nome da sua mae" nome_mae
  202. read -p "Escolaridadae?" escolaridade
  203. read -p "Nome da namorada" nome_namorada
  204. Está correto usar vários read? sim! não está errado, e tem situações que você irá precisar usar o read neste
  205. formato.
  206. Mas como é um simples formulário, podemos criar um loop for por exemplo, assim vamos economizar dedo.
  207. for form in "idade" "cor_favorita" "nome_mae" "escolaridade" "nome_namorada"; do
  208. read -p "\${form[@]}: "\${form[@]}
  209. done
  210. STATUS DE SÁIDA!
  211. Em muitos casos a váriavel de ambiente \$? salva nosso dia! principalmente quando precisamos verificar muitos
  212. status de sáida, como é no caso da interface dialog.
  213. Vamos ao exemplo, se o usuário apertar Yes o status retorna 0 se for No retorna 1.
  214. # Aperto no, o script sai.
  215. dialog --yesno "Você deseja continuar?" 0 0
  216. if [[ "\$?" -ne "0" ]]; then
  217. exit 1
  218. fi
  219. Mas pode dar erro! se por acidente em uma madrugada eu acabo inserindo um echo
  220. entre o dialog e a condicional if?
  221. Não preciso dizer que o status irá mudar não é? será sempre 0, já que é quase impossivel do echo dar erro.
  222. Você precisa entender que a váriavel de ambiente \$? é a maria vai com as outras, então tente evitar de usar ela.
  223. Mas terá casos que você irá precisar usar.
  224. Em seu lugar utilize bloco/blocos if! será melhor, e você evitá problemas futuros!
  225. Vamos ao mesmo exemplo acima com dialog...
  226. # Aperto no, o script sai.
  227. if ! dialog --yesno "Você deseja continuar?" 0 0; then
  228. exit 1
  229. fi
  230. Mais um exemplo, vamos verificar se o grep achou o usuário root em /etc/passwd
  231. if grep -e "^[Rr]oot" /etc/passwd; then
  232. printf "Encontrei o usuário root no sistema!"
  233. else
  234. printf "O usuário root não foi encontrado! favor criar."
  235. fi
  236. TESTE COM CONCIENCIA!
  237. No interpretador bash não é correto fazer testes neste formato [ teste ], sim! se você não está usando
  238. o bourne shell "sh" como interpretador prefira utilizar o padrão bash [[ teste ]].
  239. if [[ -z "\$HOME" ]]; then
  240. printf "Não está vazia."
  241. else
  242. printf "Está vazia."
  243. fi
  244. ou teste de uma linha
  245. [[ -z "\$HOME" ]] && printf "Está vazia." || printf "Não está vazia."
  246. Texto criado por Jefferson Rocha <lrcjefferson@gmail.com>
  247. EOF
  248. }
  249. ajuda(){
  250. clear
  251. cat << EOF
  252. OPÇÕES DISPONIVEIS:
  253. -c ou --criar
  254. Para criar um template utilize este parâmetro.
  255. Você pode deixar todas informações nulas se caso você deseja.
  256. -a ou --ajuda
  257. Mostra esta opção de ajuda.
  258. -d ou --dicas
  259. Texto contendo algumas dicas de programação Shell.
  260. EOF
  261. }
  262. base(){
  263. # Base de todo o programa se encontra aqui
  264. # Caso queira modificar, não esqueça de adicionar
  265. # tambem no vetor.
  266. cat << EOF > "${template}${interpretador}"
  267. #!/usr/bin/env $interpretador
  268. # Template orgulhosamente criado por (Shell-Base)
  269. #-----------HEADER-----------------------------------------------------------------|
  270. #AUTOR
  271. # $autor <$e_mail>
  272. #
  273. ##DATA-DE-CRIAÇÃO
  274. # $data
  275. #
  276. #PROGRAMA
  277. # $nome_do_programa
  278. #
  279. #PEQUENA-DESCRIÇÃO
  280. # $pequena_descricao
  281. #
  282. #LICENÇA
  283. # $licenca
  284. #
  285. #HOMEPAGE
  286. # $homepage
  287. #
  288. #CHANGELOG
  289. #
  290. #----------------------------------------------------------------------------------|
  291. #--------VÁRIAVEIS--------->
  292. # Aqui vai todas as
  293. # váriaveis do programa.
  294. #-------------------------->
  295. #--------FUNÇÕES----------->
  296. # Funções vão aqui!
  297. #-------------------------->
  298. #------TESTES-------------->
  299. # Testes iniciais do
  300. # seu programa vão
  301. # neste bloco.
  302. #-------------------------->
  303. # Programa começa aqui :)
  304. EOF
  305. }
  306. criar(){
  307. data=$(date "+%d/%m/%Y ás %H:%M")
  308. # Vetor contendo o questionario que será passado para o usuario.
  309. informacoes=("interpretador" "autor" "e_mail" "nome_do_programa" "pequena_descricao" "licenca" "homepage")
  310. local texto="${vermelho}Preencha todos os dados corretamente!
  311. Assim você não perde seu tempo depois.
  312. O arquivo gerado terá o nome ${branco}template.INTERPRETADOR${fecha} ${vermelho}no diretório atual.\n\n${fecha}"
  313. printf %b "$texto"
  314. for info in "${informacoes[@]}"; do
  315. read -ep "${info[@]}: " ${info[@]}
  316. done
  317. # Chamando e testando a função para criar template de acordo
  318. # com os dados passados.
  319. if base; then
  320. printf %b "${verde}Concluído com sucesso.\nArquivo gerado: ${template}${interpretador}${fecha}\n"
  321. exit 0
  322. else
  323. printf %b "${vermelho}Não consegui criar o arquivo, tente novamente...\n${fecha}"
  324. exit 1
  325. fi
  326. }
  327. #-------------------------->
  328. # Verificando qual parâmetro foi passado.
  329. case $1 in
  330. -c|--criar) criar ;; # Chamada Função.
  331. -a|--ajuda) ajuda ;; # Chamada Função.
  332. -d|--dicas) dicas ;; # Chamada Função.
  333. *) printf %b "Você pode conferir toda ajuda utilizando o parâmetro ${vermelho}-a${fecha} ou ${vermelho}--ajuda${fecha}\n"
  334. esac