<Anterior | Conteúdo | Próxima>
Expansões imprevistas
É possível que haja erros que ocorrem apenas de forma intermitente em um script. Às vezes, o script será executado bem e outras vezes falhará devido aos resultados de uma expansão. Se retornarmos nosso ponto-e-vírgula ausente e alterarmos o valor de número para uma variável vazia, nós
pode demonstrar:
#! / Bin / bash
# problema: script para demonstrar erros comuns
numero =
se [$ número = 1]; então
echo "O número é igual a 1." outro
echo "O número não é igual a 1."
fi
#! / Bin / bash
# problema: script para demonstrar erros comuns
numero =
se [$ número = 1]; então
echo "O número é igual a 1." outro
echo "O número não é igual a 1."
fi
Executar o script com essa mudança resulta na saída:
[me @ linuxbox ~] $ problema
/ home / me / bin / trouble: line 7: [: =: operador unário esperado O número não é igual a 1.
[me @ linuxbox ~] $ problema
/ home / me / bin / trouble: line 7: [: =: operador unário esperado O número não é igual a 1.
Recebemos esta mensagem de erro bastante enigmática, seguida pela saída do segundo eco comando. O problema é a expansão do número variável dentro do teste comando. Quando o comando:
[$ número = 1]
[$ número = 1]
sofre expansão com número estando vazio, o resultado é este:
[= 1]
[= 1]
que é inválido e o erro é gerado. o = operador é um operador binário (requer um valor em cada lado), mas o primeiro valor está faltando, então o teste comando espera um operador unário (como -z) em vez de. Além disso, uma vez que o teste falhou (por causa do erro), o if comando recebe um código de saída diferente de zero e age de acordo, e o segundo eco comando é executado.
Este problema pode ser corrigido adicionando-se aspas ao redor do primeiro argumento no teste
comando:
["$ number" = 1]
["$ number" = 1]
Então, quando ocorrer a expansão, o resultado será este:
["" = 1]
["" = 1]
que produz o número correto de argumentos. Além de strings vazias, as aspas devem ser usadas nos casos em que um valor pode se expandir em strings com várias palavras, como no caso de nomes de arquivos que contêm espaços incorporados.