2016-08-09 11 views
1

Ich bin derzeit auf diesem Stück Code seit langem fest. Unten ist mein Code.Grep 2 Variablen mit einem ":" zwischen

BookDB enthält im Wesentlichen Buchtitel und Autoreninformationen wie unten gezeigt, wobei die Syntax "Buchname: Autor" lautet.

Mary had a little nose:JamesPoppcock Merry Christmas:Christ Sake Kinky Asians:Walter Bedding

jedoch "gefunden Book" das Programm immer ausgegeben, auch wenn das Buch und Autor ist nicht in der BookDB.txt. Was ich von diesem Programm will, ist, dass es 2 Benutzereingaben, und $authorName einlesen und genau (einschließlich des Semikolons) mit der Datenbank abgleichen wird.

Jede Hilfe wird sehr geschätzt!

Edit: Das Programm immer Ausgang „Buch nicht gefunden“, statt

+0

Laden Sie Ihre Beispieldatei irgendwo hoch. – Cyrus

+0

Hallo! Ich habe die Originaltextdatei hier hochgeladen. http://txt.do/58ofn – JamesPoppycock

Antwort

1

Quote des variablen Expansionsabschnitt „Buch gefunden“:

grep -ixqF "$bookName:$authorName" BookDB.txt 

Ohne Angabe der Expansion leidet Wort Spaltung (und glob-Erweiterung) und nur das erste Wort wird als Suchmuster verwendet und der Rest wird zusammen mit BookDB.txt als Dateiname (n) behandelt.

+0

Hallo! Ich habe gerade meine Programmausgabe bearbeitet. Entschuldigung für den Fehler. Ich habe versucht, auch die Anführungszeichen hinzuzufügen, aber das Programm gibt immer noch "Buch nicht gefunden" aus, auch wenn das Buch und der Autor in der Datenbank sind. – JamesPoppycock

0

Ich bin gründlich peinlich von meinem eigenen dummen Fehler. Um die Dinge einfacher zu machen, habe ich die ursprüngliche Textdatei, die 3 weitere Parameter enthält, nicht aufgesetzt. Ich erkannte, dass das Problem mit meinem Code das grep-Argument -x ist, wo es nur Zeichenfolgen findet, die der ganzen Zeile entsprechen. Nach dem Entfernen funktioniert das Programm einwandfrei. Es ist erst nach Cyrus kommentieren, dass ich festgestellt habe, dass es wahrscheinlich das Problem mit meiner ursprünglichen BookDB.txt ist. Danke euch allen !!

-1

Ändern your're if-Anweisung unten sollten Sie lösen sind Ausgabe

if [ "$(grep -ixF "$bookName:$authorName" BookDB.txt)" != "" ]

Wie @heemayl vorgeschlagen, müssen Sie doppelte Anführungszeichen um die Variable verwenden.

Auch anstelle der Option -q von grep können Sie den Ausgang einfach mit != "" vergleichen.

+1

'grep' legt einen Exit-Code fest. Ich glaube, Sie werden feststellen, dass es keinen Vorteil hat, grep _inside_ eine Befehlssubstitution _inside_ in einen Test zu setzen, so dass der Test einen Exit-Code setzen kann. – John1024