No script de shell do Bash, qual é a diferença (se houver) entre as duas instruções a seguir?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
Eu me vi escrevendo o segundo em alguns scripts, mas então li aqui que o uso -z
alcança a mesma coisa.
Se houver problemas ao usar o segundo, devemos ignorar que o primeiro parece um pouco melhor?
bash
shell-script
Johan
fonte
fonte
Respostas:
[ "$1" = "" ]
e[ -z "$1" ]
são exatamente equivalentes no bash e em outros shells compatíveis com POSIX. (Observe que deve haver um espaço em cada lado dos colchetes, a menos que exista um caractere que não seja constituinte de palavras;
.)[
é um shell embutido como qualquer outro; de fato, também pode ser escritotest
(a única diferença entre os dois é que[
requer a]
como o último argumento). Então, se você correr[ "$1" = "" ]
com$1
expansão para-z
, o operador teste vê três argumentos:-z
,=
e a cadeia vazia. Algumas conchas Bourne mais antigas às vezes lançavam erros de análise quando um operando parecia um operador dessa maneira, mesmo que não houvesse ambiguidade na expressão completa. Não sei se alguma versão realmente teve problemas com essa expressão em particular, mas expressões mais complexas poderiam desencorajá-las. Também pode ter havido versões que tiveram problemas com palavras vazias; estes também não teriam suporte[ -z "$1" ]
. Um idioma comum do shell é[ x"$1" = x"" ]
. Evita qualquer risco de ter operandos analisados como operadores, porque nenhum operador começa com uma letra.No ksh, bash e zsh, você pode usar a sintaxe entre colchetes
[[ -z $1 ]]
,. Essa sintaxe mais recente (é do final dos anos 80 e não da metade dos anos 70) elimina o risco de ter operandos analisados como operadores usando uma construção sintática especial em vez de um embutido comum. Os operadores devem aparecer literalmente, sem aspas, entre colchetes, e você não precisa aspas duplas nas expansões variáveis.fonte