Pesquisa de site

Como executar o modo de depuração de verificação de sintaxe em scripts Shell


Iniciamos a série de depuração de script de shell explicando as diferentes opções de depuração e como ativar os modos de depuração de script de shell.

Depois de escrever seus scripts de shell, é recomendável verificar praticamente a sintaxe dos scripts antes de executá-los, em vez de observar sua saída para confirmar se estão funcionando corretamente.

Nesta parte da série, veremos como usar o modo de depuração de verificação de sintaxe. Lembre-se de que explicamos as diferentes opções de depuração na primeira parte desta série e aqui as usaremos para realizar a depuração de scripts.

Ativando o modo de depuração detalhada

Antes de passarmos ao foco principal deste guia, vamos explorar brevemente o modo detalhado. É habilitado pela opção de depuração -v, que diz ao shell para exibir todas as linhas em um script enquanto elas são lidas.

Para demonstrar como isso funciona, abaixo está um exemplo de script de shell para converter em lote imagens PNG para o formato JPG.

Digite (ou copie e cole) em um arquivo.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Em seguida, salve o arquivo e torne o script executável usando o comando abaixo:

chmod +x script.sh

Podemos invocar o script e exibir todas as linhas nele conforme são lidas pelo shell, assim:

bash -v script.sh

Habilitando o modo de depuração de verificação de sintaxe em scripts Shell

Voltando ao nosso tópico de ênfase, o -n ativa o modo de verificação de sintaxe. Ele instrui o shell a ler basicamente todos os comandos, porém não os executa, ele (shell) apenas examina a sintaxe utilizada.

Caso haja erros no seu shell script, o shell irá exibir os erros no terminal, caso contrário, não exibirá nada.

A sintaxe para ativar a verificação de sintaxe é a seguinte:

bash -n script.sh

Como a sintaxe do script está correta, o comando acima não exibirá nenhuma saída. Portanto, vamos tentar remover a palavra done que fecha o loop for e ver se ela mostra algum erro:

Abaixo está o script de shell modificado para converter em lote imagens png para o formato jpg que contém um bug.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Salve o arquivo e execute-o enquanto realiza a verificação de sintaxe:

bash -n script.sh

A partir da saída acima, podemos ver que há um problema de sintaxe com nosso script, o loop for está faltando uma palavra-chave de fechamento done. E o shell procurou até o final do arquivo e como não encontrou (feito), o shell imprimiu um erro de sintaxe:

script.sh: line 11: syntax error: unexpected end of file

Também podemos combinar o modo detalhado e o modo de verificação de sintaxe:

bash -vn script.sh

Alternativamente, podemos ativar a verificação de sintaxe modificando a primeira linha do script acima como no próximo exemplo.

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Como antes, salve o arquivo e execute-o enquanto realiza a verificação de sintaxe:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

Além disso, podemos empregar o comando interno set shell para ativar o modo de depuração no script acima.

No exemplo abaixo, estamos apenas verificando a sintaxe do loop for em nosso script.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Mais uma vez, salve o arquivo e invoque o script:

./script.sh 

Em resumo, devemos sempre garantir que verificamos sintaticamente nossos scripts de shell para capturar qualquer erro antes de executá-los.

Para nos enviar quaisquer perguntas ou comentários sobre este guia, use o formulário de resposta abaixo. Na terceira parte desta série, passaremos a explicar e usar o modo de depuração de rastreamento de shell.