Bash-Skript-Parsing-Argument mit Anführungszeichen

8

Bitte beachten Sie dieses einfache Skript mit dem Namen test :

#!/bin/bash
echo $1

und die folgenden Befehle und Aufrufe:

$ 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

Könnte jemand bitte , warum der Anruf von erklären Test doens't verhalten sich wie der Befehl echo oder Punkt auf der entsprechenden Dokumentation?

Toliveira
quelle
2
Es gibt bereits einen Testbefehl . Sie haben Glück, dass Sie den vollständigen Pfad verwendet haben. Andernfalls hätten Sie es schwer gehabt, die Situation zu debuggen.
Rui F Ribeiro
3
Besser für diese Art von Test ist es, printf '%q\n' "$@"statt echoüberhaupt zu verwenden, wodurch Ihre Argumente einzeln mit versteckten Zeichen und Leerzeichen in sichtbarer Form ausgegeben werden.
Charles Duffy

Antworten:

13

Weil alle it-Argumente echoverkettet werden, um sie zu drucken, und Ihr Skript auf das erste Argument beschränkt ist. Sie sollten verwenden und nicht in Ihrem Skript."$@"$1

Schauen wir uns die Argumente an, die Sie für Ihre Tests angeben:

  • ./test "A B"
    • Ein Argument, die 3-stellige Zeichenfolge AspaceB
  • ./test ""A B""
    • zwei Argumente
      • zuerst empty stringverkettet mitA
      • zweitens Bverkettet mitempty string
  • ./test """A B"""
    • ein Argument, empty stringverkettet mit AspaceBverkettet mitempty string
  • ./test """"A B""""
    • zwei Argumente
      • zuerst empty stringverkettet mit empty stringverkettet mitA
      • zweitens Bverkettet mit empty stringverkettet mitempty string

Hinweis: Sie würden andere Ergebnisse sehen, als echowenn Sie mehr als ein Leerzeichen in Ihren Argumenten verwendet hätten. Das liegt daran, dass echo seine Argumente mit einem einzigen Leerzeichen verkettet:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
Glenn Jackman
quelle
das sind nette kleine leere String- Doodads.
Mikeserv
2
genau, Zitate nisten nicht ...
mr.spuratic