2016-12-12 10 views
1

Im Grunde nach einer Zeichenfolge suchen, die ein Sternchen enthält, suchte nach einer, die sich auf eine bis Schleife bezieht, aber ohne Erfolg!Test, ob eine Zeichenfolge ein literales Sternchen enthält

z.B. der Benutzer würde im Grunde immer in Strings eingeben und das Programm wird sie ablehnen, bis eine, die ein Sternchen hat, erscheint.

dann an diesem Punkt wird es eine Nachricht echo [kippe gehen in die Details traurig]

Code:

until [ "string" == "[asteriskstuff]" ] 
do 

    echo "just give me a string with an asterisk for crying out loud" 

    read "string" 

done 

, wenn der Benutzer die Eingabe beendet hallo und entscheidet dann zur Eingabe hallo * es wird dann zeigen die Echobotschaft grundsätzlich möchte ich nur das bluten asterisk umgehen, weil [asteriskstuff] der Bereich ist, in dem ich immer schwanke!

alle helfen geschätzt!

ZUSAMMENFASSUNG: Wie kann ich ein Sternchen auf einfache Weise für eine Vor-Schleife umgehen?

+0

Wir müssen wissen, woher asteriskstuff stammt.Es ist eine Variable? Hat es einen wörtlichen Teil? –

+1

'[]' ist ein alternativer Name für [der POSIX-spezifizierte Befehl 'test'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Der einzige String-Vergleichsoperator, den der Standard zur Unterstützung garantiert, ist' = ', nicht' == '(und es gibt keine Standard- definierter Teilstring-Match-Vorgang überhaupt). Bash unterstützt '== 'als Erweiterung, aber wenn Sie Erweiterungen wünschen, sollten Sie' [[]] 'stattdessen verwenden, was die * explizit * erweiterte Form des Operators ist, der auch Globbing, reguläre Ausdrücke und viele davon unterstützt andere Güte. –

+1

BTW, es ist in keiner Weise klar, was Sie mit den meisten dieser Nachricht meinen. Was meinst du mit dem Wort "umgehen" in "ein Asterisk umgehen"? Willst du den gleichen Vergleich bekommen, hättest du ** ohne ** das Sternchen da? Möchten Sie die Schleife in diesem Zustand verlassen? Etwas anderes? –

Antwort

4

chepner's helpful answer erklärt das Problem mit Ihrem ursprünglichen Ansatz gut.

auf der RHS von passenden
until [[ $string == *'*'* ]]; do 
    echo "just give me a string with an asterisk for crying out loud" 
    read -r string 
done 
  • [[ ... ]] anstatt [ ... ] muss verwendet werden, um ==Muster zu ermöglichen (:

    Die folgenden Aufforderungen, bis ein Literal * wird überall in der Benutzereingabe gefunden =).

    • Sofern Sie POSIX-konforme Skripte (für /bin/sh) schreiben, wo nur [ ... ] unterstützt wird, betrachten [[ ... ]] routinemäßig verwendet wird, weil es mehr Funktionen und weniger Überraschungen bietet: this answer von mir sehen.
  • *'*'* ist ein pattern, der sagt:* eine wörtliche übereinstimmen - die Single- zitierte Teil - überall in der Zeichenfolge; Die nicht aufgeführten* Instanzen repräsentieren beliebige Zeichenfolgen.

    • Diese Muster sind die gleichen wie die in Dateinamen verwendet diejenigen Globbing und sind nicht reguläre Ausdrücke.
    • Bash bietet jedoch auch reguläre Ausdruck Anpassung über [[ ... =~ ... ]]. Somit könnte die bedingte auch als [[ $string =~ '*' ]] oder [[ $string =~ \* ]]
  • -r sollte mit read als eine Frage der Gewohnheit verwendet werden, geschrieben werden, unerwartete Verarbeitung von \ Zeichen zu verhindern.

+0

Danke für die Erklärung, dass doppelte Klammern verwendet werden müssen, ich habe ständig einzelne Klammern verwendet, da sie einfacher zu machen sind und scheinbar die Aufgabe erledigen. Das war eines der Hauptprobleme. –

+0

@StudentofArt Mein Vergnügen; Wenn Sie in Bash-Skripten nicht POSIX-kompatibel sein müssen, lohnt sich die Verwendung von '[[...]]' normalerweise - ich habe meine Antwort mit einem Link aktualisiert, der "[[...]]" kontrastiert und '[...]'. – mklement0

3

@mklement's answer bietet tatsächlich eine Lösung; Ich beschreibe hauptsächlich das Problem.


Sie vergleichen nicht die Wert des Parameters string; Sie vergleichen die Literalzeichenfolge string. Das hat nichts mit Klümpchen zu tun (man sonst Dinge zitieren richtig sind.

until [ "$string" = "[asteriskstuff]" ]; do 
    read string 
done 

Sie brauchen nicht das Argument read zu zitieren, da es sich um eine Zeichenkette, die eine gültige Kennung sein muss, dem nur bestehen aus _, Buchstaben und Zahlen.Zitieren tut es jedoch nicht weh.

Verwandte Themen