É possível verificar uma sintaxe de script bash sem executá-lo?
Usando Perl, eu posso correr perl -c 'script name'. Existe algum comando equivalente para scripts bash?
É possível verificar uma sintaxe de script bash sem executá-lo?
Usando Perl, eu posso correr perl -c 'script name'. Existe algum comando equivalente para scripts bash?
Respostas:
bash -n scriptname
Talvez uma ressalva óbvia: isso valida a sintaxe, mas não verifica se o script bash tenta executar um comando que não está no seu caminho, como em ech hellovez de echo hello.
set.
if ["$var" == "string" ]em vez deif [ "$var" == "string" ]
type [diz "[é um shell embutido". Em última análise, delega para o testprograma, mas espera também um colchete. Então é assim if test"$var", que não é o que o autor quis dizer, mas é sintaticamente válido (digamos que $ var tenha o valor "a", veremos "bash: testa: comando não encontrado"). O ponto é que, sintaticamente, não há espaço em falta.
[só é invocado neste caso se for $varexpandido para uma string vazia . Se for $varexpandido para uma sequência não vazia , [é concatenado com essa sequência e é interpretado como um nome de comando (não nome da função ) por Bash e, sim, isso é sintaticamente válido, mas, como você afirma, obviamente não é a intenção. Se você usar, em [[vez de [, mesmo que [[seja uma palavra-chave shell (em vez de incorporada), obterá o mesmo resultado, porque a concatenação não intencional de cadeias ainda substitui o reconhecimento da palavra-chave.
["$var"é sintaticamente uma expressão de nome de comando válida ; da mesma forma, tokens ==e "$string"são argumentos de comando válidos . (Geralmente, builtin [é analisado com comando sintaxe, enquanto que [[- como um shell de palavras-chave - é analisado de forma diferente.) O builtin shell [que não delegar ao " testprograma" (utilitário externo): bash, dash, ksh, zshtodos têm incorporado versões de ambos [etest, e eles não chamam suas contrapartes de utilidade externa.
O tempo muda tudo. Aqui está um site que fornece verificação de sintaxe on-line para o shell script.
Eu achei muito poderoso detectar erros comuns.

O ShellCheck é uma ferramenta estática de análise e limpeza para scripts sh / bash. Ele se concentra principalmente no tratamento de erros e armadilhas típicas para iniciantes e de nível intermediário, em que o shell apenas fornece uma mensagem de erro enigmática ou comportamento estranho, mas também relata alguns problemas mais avançados em que casos de canto podem causar falhas atrasadas.
O código-fonte Haskell está disponível no GitHub!
apt-get install shellcheck
trusty-backports.
Eu também habilito a opção 'u' em todos os scripts do bash que escrevo para fazer uma verificação extra:
set -u
Isso relatará o uso de variáveis não inicializadas, como no script a seguir 'check_init.sh'
#!/bin/sh
set -u
message=hello
echo $mesage
Executando o script:
$ check_init.sh
Relatará o seguinte:
./check_init.sh[4]: mesage: Parâmetro não definido.
Muito útil para detectar erros de digitação
set -uembora isso realmente não responda à pergunta, você deve executar o script para receber a mensagem de erro. Nem mesmo bash -n check_init.shmostra que aviso
sh -n script-name
Rode isto. Se houver algum erro de sintaxe no script, ele retornará a mesma mensagem de erro. Se não houver erros, ele será exibido sem enviar nenhuma mensagem. Você pode verificar imediatamente usando echo $?, que retornará 0confirmando com êxito sem nenhum erro.
Funcionou bem para mim. Eu corri no Linux OS, Bash Shell.
sh -nprovavelmente não verificará se o script é um script Bash válido. Pode dar falsos negativos. shé uma variante de shell Bourne que geralmente não é o Bash. Por exemplo, no Ubuntu Linux realpath -e $(command -v sh)dá / bin / dash
Na verdade, verifico todos os scripts bash no diretório atual para erros de sintaxe SEM executá-los usando a findferramenta:
Exemplo:
find . -name '*.sh' -exec bash -n {} \;
Se você quiser usá-lo para um único arquivo, basta editar o curinga com o nome do arquivo.
comando nulo [dois pontos] também é útil ao depurar para ver o valor da variável
set -x
for i in {1..10}; do
let i=i+1
: i=$i
done
set -
set -xmostra a cada linha antes de ser executado
Há o plug-in BashSupport para o IntelliJ IDEA, que verifica a sintaxe.
.shoutra extensão associada aos scripts Bash, o que acontece se você gerar os scripts usando alguma ferramenta de modelagem como ERB (então eles terminam com .erb). Por favor vote em youtrack.jetbrains.com/issue/IDEA-79574 se você quiser consertar!
Se você precisar em uma variável a validade de todos os arquivos em um diretório (gancho de pré-confirmação do git, script build lint), poderá capturar a saída stderr dos comandos "sh -n" ou "bash -n" (consulte outros respostas) em uma variável e tenha um "if / else" com base nesse
bashErrLines=$(find bin/ -type f -name '*.sh' -exec sh -n {} \; 2>&1 > /dev/null)
if [ "$bashErrLines" != "" ]; then
# at least one sh file in the bin dir has a syntax error
echo $bashErrLines;
exit;
fi
Mude "sh" com "bash" dependendo das suas necessidades