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?


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

ce sont de petits doodads à cordes vides .
mikeserv

2
exactement, les citations ne s'emboîtent pas ...
mr.spuratic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.