ti-enxame.com

No Bash, se [-z "$ 1"] e se ["$ 1" = ""] são iguais?

No script do Bash Shell, qual é a diferença (se houver) entre as duas instruções a seguir?

1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]

Eu me encontrei escrevendo o segundo em alguns scripts, mas então li aqui que usando -z consegue a mesma coisa.

Se houver problemas ao usar o segundo, devemos ignorar que o primeiro parece um pouco melhor?

29
Johan

[ "$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 da Palavra como ;.)

[ é um Shell incorporado como qualquer outro; na verdade, também pode ser escrito test (a única diferença entre os dois é que [ requer uma ] como o último argumento). Então, se você executar [ "$1" = "" ] com $1 expandindo para -z, o operador de teste vê três argumentos: -z, = e a string vazia. Às vezes, alguns shells Bourne mais antigos 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 teve problemas com essa expressão em particular, mas expressões mais complexas podem desencorajá-las. Também pode ter havido versões que tiveram problemas com palavras vazias; estes não teriam suportado [ -z "$1" ] ou. 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 de colchete duplo, [[ -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.

37