Argumento de análise de script Bash com citações

8

Por favor, considere este script simples chamado test :

#!/bin/bash
echo $1

e os seguintes comandos e chamadas:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

Alguém poderia explicar por que a chamada de teste não se comporta como o comando echo ou aponta para a documentação relevante?

    
por toliveira 08.12.2015 / 17:15

1 resposta

13

Porque echo concatena todos os argumentos para imprimi-los, e seu script está limitado ao argumento primeiro . Você deve usar "$@" e não $1 no seu script.

Vamos analisar os argumentos que você está fornecendo para seus testes:

  • %código%
    • um argumento, a cadeia de 3 caracteres A espaço B
  • %código%
    • dois argumentos
      • primeiro, string vazia concatenada com A
      • segundo, B concatenado com string vazia
  • %código%
    • um argumento, string vazia concatenada com A espaço B concatenado com string vazia
  • %código%
    • dois argumentos
      • primeiro, string vazia concatenada com string vazia concatenada com A
      • segundo, B concatenado com string vazia concatenada com string vazia

Nota: você veria resultados diferentes de ./test "A B" se você tivesse usado mais de um espaço em seus argumentos. Isso porque o eco concatena seus argumentos com um único espaço:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
    
por 08.12.2015 / 17:19