Checagens em Shell Script

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!

🙂

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *