No reino dos terminales, um simples ponto e vírgula (:) desempenha um papel crucial que muitos podem subestimar. Em situações onde o script exige argumentos, a verificação de argumentos obrigatórios é uma tarefa rotineira. Tradicionalmente, isso é feito com um if-statement, mas há uma forma mais elegante que utiliza o ponto e vírgula para economizar linhas de código:
if [ -z '$1' ]; then
echo 'missing argument, aborting.' 1>&2
exit 1
fi
echo 'Hello $1!'
Podemos reescrever a verificação de argumentos em apenas uma linha usando o null-command e a expansão de parâmetros:
: '${1:?missing argument, aborting.}'
echo 'Hello $1!'
Ao referenciar uma variável com um nome apropriado, o comportamento é o mesmo que antes, mas mais fácil de identificar, pois inclui o nome da variável no diagnóstico:
: '${GREET_NAME:?missing argument, aborting.}'
echo 'Hello $GREET_NAME!'
A expansão de parâmetros ${name:?diagnostic} verifica se $name está unset ou vazio. Se estiver, a mensagem de diagnóstico é impressa no stderr e o shell sai com um status diferente de zero. Se a variável estiver setada, é equivalente a $name.
O comando nulo (:) é um builtin que não faz nada além de processar seus argumentos e descartar o resultado. Ele é tão antigo que remonta à shell de Thompson de 1971, onde atuava como rótulo e o primeiro marcador de comentário do Unix.
Existem várias maneiras de usar o comando nulo que podem surpreender. Ele pode ser usado para estabelecer padrões, truncar arquivos de log e verificar a legibilidade e escrita de arquivos, como no exemplo a seguir:
: '${DATA_DIR:=/var/data}' # set defaults
: '${RETRIES:=3}' # instead of running it as a command
: > error.log # truncate error.log
: > error.log > access.log # truncate both error.log and access.log
( : < dataset.json ) && echo YES # is dataset.json readable?
( : >> result.json ) && echo YES # is result.json writable?
Se você preferir escrever menos e ir rápido, o comando nulo e a expansão de parâmetros são uma dupla que vale a pena estudar antes que seu café fique frio.
Existem dúvidas sobre a necessidade do comando nulo e como ele se compara com a atribuição de variáveis tradicional. O comando nulo evita que a expansão de parâmetros seja tratada como um comando a ser executado, ao invés de apenas avaliar a expressão.
Ao usar o comando nulo, reduzimos o número de potenciais erros tipográficos de dois para um, tornando o código mais limpo e menos propenso a erros.
Conclusão: o poderoso ponto e vírgula no shell scripting é uma ferramenta versátil que melhora a legibilidade, a eficiência e a precisão do código, tornando-o uma aliada valiosa para os usuários de terminal.