Argumento de análisis de script Bash con comillas

8

Considere este script simple llamado prueba :

#!/bin/bash
echo $1

y los siguientes comandos y llamadas:

$ 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

¿Podría alguien explicar por qué la llamada de prueba no se comporta como el comando echo o apunta a la documentación relevante?

toliveira
fuente
2
Ya hay un comando de prueba , tienes suerte de que estuvieras usando la ruta completa, de lo contrario habrías tenido dificultades para depurar la situación.
Rui F Ribeiro
3
Es mejor usar este tipo de prueba en printf '%q\n' "$@"lugar de usarla echo, lo que emitirá sus argumentos uno a una con caracteres ocultos y espacios en blanco escapados en forma visible.
Charles Duffy

Respuestas:

13

Porque echoconcatena todos sus argumentos para imprimirlos, y su script se limita al primer argumento. Debe usar "$@"y no $1en su script.

Veamos los argumentos que está proporcionando para sus pruebas:

  • ./test "A B"
    • un argumento, la cadena de 3 caracteres AspaceB
  • ./test ""A B""
    • dos argumentos
      • primero, empty stringconcatenado conA
      • segundo, Bconcatenado conempty string
  • ./test """A B"""
    • un argumento, empty stringconcatenado con AspaceBconcatenado conempty string
  • ./test """"A B""""
    • dos argumentos
      • primero, empty stringconcatenados con empty stringconcatenados conA
      • segundo, Bconcatenados con empty stringconcatenados conempty string

Nota: vería resultados diferentes de echosi hubiera usado más de un espacio en sus argumentos. Eso es porque echo concatena sus argumentos con un solo espacio:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
Glenn Jackman
fuente
esos son pequeños y limpios cordones vacíos .
mikeserv
2
exactamente, las citas no anidan ...
mr.spuratic