É 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 hello
vez de echo hello
.
set
.
if ["$var" == "string" ]
em vez deif [ "$var" == "string" ]
type [
diz "[é um shell embutido". Em última análise, delega para o test
programa, 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 $var
expandido para uma string vazia . Se for $var
expandido 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 " test
programa" (utilitário externo): bash
, dash
, ksh
, zsh
todos 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 -u
embora isso realmente não responda à pergunta, você deve executar o script para receber a mensagem de erro. Nem mesmo bash -n check_init.sh
mostra 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á 0
confirmando com êxito sem nenhum erro.
Funcionou bem para mim. Eu corri no Linux OS, Bash Shell.
sh -n
provavelmente 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 find
ferramenta:
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 -x
mostra a cada linha antes de ser executado
Há o plug-in BashSupport para o IntelliJ IDEA, que verifica a sintaxe.
.sh
outra 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