Se você vai fazer um script um pouco mais criterioso, é de extrema importância que você faça algumas verificações, seja dos comandos externos utilizados, seja o usuário (ou grupo) que poderá (ou não) utilizar tal script ou qualquer outra verificação prévia que precise ser feita. Então, vamos aqui demonstrar como algumas dessas coisas podem ser feitas.
Lembrando que os comandos aqui utilizados valem para o Shell Script que utiliza o BASH!
Essas checagens devem ser feitas, preferencialmente, no início do script. Não esqueça disso!!
Verificando a versão do Bash
Alguns comandos (por exemplo array) só estão disponíveis a partir de uma versão específica do Bash (versão 4 em diante). Então, pode acontecer de um script funcionar perfeitamente na sua máquina, mas em um servidor não. Tudo isso porque a versão do servidor não suporta arrays, por exemplo. Para verificar isso, fazemos a seguinte checagem:
#!/usr/bin/env bash
if [ ${BASH_VERSINFO[0]} -lt 4 ]; then
echo "Essa versão do bash não suporta array"
exit 1
fi
Se você não faz ideia do que a estrutura acima faz, recomendo dar uma olhada nessa página.
Verificando comandos externos
Muito bem. Você fez um script utilizando awk, sed, curl… Mas não tem certeza se isso, realmente, vai funcionar em outras máquinas. Pode ser que funcione, mas pode ser que não. Um erro muito comum é se o programa existe na máquina. Para checar isso, utilizamos a estrutura abaixo:
#!/usr/bin/env bash
if [ ! -x /usr/bin/awk ]; then
echo "Erro: 'awk' não é um arquivo ou não é um arquivo executável!"
exit 126
fi
Repare que, no comando acima, apareceu um sinal de exclamação antes da flag -x. O sinal de exclamação, em muitas linguagens de programação, significa negação. A flag -x (mais dessas flags podem ser vistas aqui) retorna true (verdadeiro) se o que foi passado para ela é um arquivo E se esse arquivo é executável. Quando passamos a exclamação, estamos verificando se o arquivo em questão não é, de fato um arquivo OU não é um arquivo executável. Em geral, as verificações utilizam o sinal de exclamação.
Resumindo:
- -x /usr/bin/awk – true, se /usr/bin/awk é um arquivo E é um arquivo executável
- ! -x /usr/bin/awk – true, se /usr/bin/awk não é um arquivo OU não é um arquivo executável
Verificando o ID do usuário
Supomos que o seu script executa tarefas em que apenas um usuário que possua bastantes privilégios possa executá-lo. Nada mais interessante do que verificar o ID desse usuário. Se o seu script só puder ser executado pelo root, faça:
#!/usr/bin/env bash
if [ ${UID} -ne 0 ]; then
echo "Erro: somente o usuário root tem permissão para executar esse script!"
exit 1
fi
A estrutura acima utiliza a variável UID (Não sabe o que significa? Veja aqui).
Exit Code Number
Em todas as estruturas, foi utilizado um comando em comum: o exit
Esse comando faz com que a execução do script seja interrompida imediatamente. Mas o que significa o número que vem em seguida? Esse número chama-se Exit Code. É com ele que o shell verifica se determinado comando foi executado perfeitamente ou não.
Quando um comando executou perfeitamente, seu Exit Code é 0. Quando um comando não é encontrado ou não tem permissão para execução, seu Exit Code é 126. Em geral, utiliza-se o Exit Code 1, quando algo não executou corretamente no script. Mais códigos podem ser vistos aqui.
Algumas considerações
Em scripts um pouco mais sérios, é bom que sejam feitas, além das checagens, uma certa padronização do código. Até porque o script será feito por você, mas será lido (e executado) por várias pessoas. Hoje você lê e entende o código. Mas, quem garante que será assim depois de alguns meses?
- Pense em criar funções (e variáveis) com nomes legíveis ou que tenham a ver com o que é executado. Se você cria uma função que verifica o load de um servidor, pense em variáveis como “${valorLimiteLoad}” ou “${limiteLoad}”. Evite coisas como “${x}” ou “${y}”.
- Divida seu script em funções pequenas. Será MUITO MAIS FÁCIL achar um problema dessa forma do que fazendo o script inteiro em uma única função (ou sem nenhuma). Para aprender mais sobre funções, visite essa página.
- Para verificar se determinado comando existe, antes de iniciar a execução do script, utilize o comando type com a flag -p. Exemplo: cmdAwk=$(type -p awk)
Isso fará com que o comando awk (através da variável ${cmdAwk}) seja executado, em todo o script, independente de onde ele esteja (/usr/bin, /bin, /opt/bin, etc).
E é isso!
🙂