Argument d'analyse du script Bash avec des guillemets

8

Veuillez considérer ce script simple nommé test :

#!/bin/bash
echo $1

et les commandes et appels suivants:

$ 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

Quelqu'un pourrait-il expliquer pourquoi l'appel de test ne se comporte pas comme l' écho de la commande ou pointer vers la documentation pertinente?

toliveira
la source
2
Il existe déjà une commande de test , vous avez de la chance que vous utilisiez le chemin complet, sinon vous auriez eu du mal à déboguer la situation.
Rui F Ribeiro
3
Mieux pour ce type de test est d'utiliser printf '%q\n' "$@"au lieu de echodu tout, qui émettra vos arguments un à une avec des caractères cachés et des espaces échappés sous une forme visible.
Charles Duffy

Réponses:

13

Parce que echoconcatène tous ses arguments pour les imprimer, et votre script est limité au premier argument. Vous devez utiliser "$@"et non $1dans votre script.

Examinons les arguments que vous fournissez pour vos tests:

  • ./test "A B"
    • un argument, la chaîne de 3 caractères AspaceB
  • ./test ""A B""
    • deux arguments
      • d'abord, empty stringconcaténé avecA
      • deuxièmement, Bconcaténé avecempty string
  • ./test """A B"""
    • un argument, empty stringconcaténé avec AspaceBconcaténé avecempty string
  • ./test """"A B""""
    • deux arguments
      • d'abord, empty stringconcaténé avec empty stringconcaténé avecA
      • deuxièmement, Bconcaténé avec empty stringconcaténé avecempty string

Remarque: vous verriez des résultats différents echosi vous aviez utilisé plus d'un espace dans vos arguments. En effet, echo concatène ses arguments avec un seul espace:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
glenn jackman
la source
ce sont de petits doodads à cordes vides .
mikeserv
2
exactement, les citations ne s'emboîtent pas ...
mr.spuratic