echo [9876543210] zeigt 1 4 5 6 an… warum?

19

Bitte erläutern Sie, warum für die letzten vier Echoanweisungen 1 4 5 6 angezeigt wird. Ich habe dies einmal versehentlich getroffen, bin jetzt aber gespannt, warum dieses Verhalten auftritt.

Diese Aussagen funktionieren wie erwartet (für mich).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Diese Echoanweisungen zeigen konsistent 1 4 5 6 an. Haben diese Zahlen etwas Besonderes?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Vielen Dank!

  • Das mögliche Duplikat ist verwandt und hilfreich, aber kein Duplikat. Das mögliche Duplikat ist aus Sicht eines rmBefehls. Diese Frage ist aus der Perspektive eines wahrgenommenen "seltsamen Verhaltens" eines echoBefehls. Die zugrunde liegende Antwort für beide ist Globbing. Jemand, der nach Problemen mit einem echoBefehl sucht, würde die rmFrage nicht leicht finden , aber wahrscheinlich hier landen.
MikeD
quelle
16
Sie haben 4 Dateien in Ihrem aktuellen Verzeichnis mit dem Namen: 1 4 5und6
Jeff Schaller
5
Lol, der Bot unter metasmoke.erwaysoftware.com/post/58973 markiert diesen Beitrag als Spam, weil er "eine Telefonnummer im Titel hat" ... wirklich?
Carlo Wood
2
@CarloWood, zehn aufeinanderfolgende Ziffern stimmen mit einer Telefonnummer in den USA mit der Vorwahl überein. Geschrieben mit normaler Formatierung wäre es 987-654-3210.
Mark
1
Beachten Sie nullglob, dass Ihr zweites Beispiel ( echo [237890]) beim Einschalten tatsächlich nichts ausgibt. Dies könnte ein Hinweis darauf sein, dass Sie in den anderen Beispielen eine Glob-Erweiterung festgestellt haben.
Kyle Strand
3
Mögliches Duplikat der Arbeit von rm / ls mit [0-9]
muru

Antworten:

33

Die offene Klammer [ist ein besonderer Charakter für die Muschel. Es öffnet sich ein Mustervergleichsalgorithmus, der besagt "Übereinstimmung mit einem der Zeichen in Klammern". Da sich in Ihrem aktuellen Verzeichnis 4 Dateien mit den Namen 1, 4, 5 und 6 befinden, ersetzt Ihre Shell die Musterübereinstimmung durch diese Dateinamen, wenn die Zeichen in den Klammern eine dieser Ziffern enthalten. Wenn Sie stattdessen verwenden echo [ 9876543210 ]Sie Echo mit 3 Parametern aufrufen: [, 9876543210, und ].

Sie sollten die Parameter Ihrer Echo-Anweisung in Anführungszeichen setzen, um zu verhindern, dass die Shell sie als Mustervergleichsanforderung ansieht.

$ echo '[9876543210]'
[9876543210]

(Oder entfernen Sie die Dateien mit den Namen 1, 4, 5 und 6 - aber das ist eine Problemumgehung, um das Verhalten zu demonstrieren, keine Fehlerbehebung).

Jeff Schaller
quelle
4
Vielleicht wäre es besser zu sagen, dass echo [ 987 ]Anrufe echomit drei Parametern, als auch nur zu erwähnen test?
Dhag
2
es würde in der Tat! Ich habe
Jeff Schaller
1
* Ich mag auch Ihre Erstantwort-Version, da ich diese beim Ausprobieren von Echo-Statements verschiedener Tests zum ersten Mal gesehen habe.
MikeD
1
Die ursprüngliche Antwort ist nicht einmal wahr. Er schrieb: Echo [9876543210]. Es erfolgt kein Aufruf von [(also test).
Knezi
Der entscheidende Punkt ist, dass das Argument to echounterschiedlich interpretiert wird, bashje nachdem, ob zwischen den eckigen Klammern und dem Inhalt Leerzeichen stehen oder nicht. [123]vs. [ 123 ].
Jskroch