Argumento de análise de script Bash com aspas

8

Por favor, considere este script simples chamado teste :

#!/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 do teste não se comporta como o comando ecoar ou apontar para a documentação relevante?

toliveira
fonte
2
Já existe um comando de teste ; você tem sorte de estar usando o caminho completo; caso contrário, teria dificuldade em depurar a situação.
Rui F Ribeiro
3
O melhor para esse tipo de teste é usar em printf '%q\n' "$@"vez de echo, o que emitirá seus argumentos individualmente com caracteres ocultos e espaços em branco escapados de forma visível.
Charles Duffy

Respostas:

13

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

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

  • ./test "A B"
    • um argumento, a sequência de 3 caracteres AspaceB
  • ./test ""A B""
    • dois argumentos
      • primeiro, empty stringconcatenado comA
      • segundo, Bconcatenado comempty string
  • ./test """A B"""
    • um argumento, empty stringconcatenado com AspaceBconcatenado comempty string
  • ./test """"A B""""
    • dois argumentos
      • primeiro, empty stringconcatenado com empty stringconcatenado comA
      • segundo, Bconcatenado com empty stringconcatenado comempty string

Nota: você veria resultados diferentes echose 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
Glenn Jackman
fonte
esses são pequenos rabiscos vazios .
mikeserv
2
exatamente, as aspas não estão
aninhadas