2017-07-21 2 views
-2

Ich versuche, eine Datei für meine Shell als eine Eingabe bereitzustellen, die im Gegenzug testen sollte, ob die Datei ein bestimmtes Wort enthält und entscheiden, welcher Befehl ausgeführt werden soll. Ich weiß noch nicht, wo der Fehler liegen könnte. Hier finden Sie das Shell-Skript, das ich schrieb:Befehl bash ausführen abhängig von Schlüsselwort

#!/bin/(shell) 

input_file="$1" 

output_file="$2" 

grep "X-G303" | awk -f ./mno/script.awk $input_file > t1.json 

grep "x-g301" | sh ./mno/tm.sh $input_file > t2.json 

wenn ich Eingang der die Datei, die awk alles wie erwartet ausgeführt werden sollen verwendet, aber für den zweiten Befehl, den ich nicht einmal eine Ausgabedatei erhalten. Jede Hilfe wird sehr geschätzt Prost,

+0

Ihre 'grep' Befehle werden nicht an eine Datei übergeben, daher sollten diese Befehle unbestimmt blockieren, während' grep' 'stdin' verarbeitet. Außerdem ist '|' kein "oder" -Befehl, es ist eine Pipe, die das output des Befehls auf der linken Seite zur Eingabe des Befehls auf der rechten Seite sendet, und es ist wahrscheinlich nützlich, uns die tatsächliche Shell zu zeigen, die Sie verwenden anstelle von '(shell)', obwohl das 'bash'-Tag wahrscheinlich eine gute Ahnung ist –

+0

Danke, dass Sie das bemerkt haben. Ich habe es korrigiert und es funktioniert! –

Antwort

1

Sie haben dies nicht in Ihrer Frage angegeben, aber ich vermute, Sie haben eine Datei mit dem Schlüsselwort, z. Datei cmdfile, die x-g301 enthält. Und dann führen Sie Ihr Skript wie:

./script "input_file" "output_file" < cmdfile 

Wenn ja, der erste grep Befehl wird die gesamte cmdfile auf stdin verbrauchen, während für das erste Muster suchen, und nichts wird für das zweite grep gelassen werden. Deshalb erzeugt das zweite grep und dann Ihr zweites Skript keine Ausgabe.

Es gibt viele Möglichkeiten, dies zu beheben, aber die Wahl der richtigen hängt davon ab, was genau Sie versuchen, und wie sieht das cmdfile aussehen. Unter der Annahme, das ist eine größere Datei mit anderen Dingen als nur die Befehlsmuster, können Sie diese Datei als drittes Argument an das Skript übergeben, wie folgt aus:

./script "input_file" "output_file" "cmdfile" 

und haben Ihr Skript es so handhaben:

#!/bin/bash 

input_file="$1" 
output_file="$2" 
cmdfile="$3" 

if grep -q "X-G303" "$cmdfile"; then 
    awk -f ./mno/script.awk "$input_file" > t1.json 
fi 

if grep -q "x-g301" "$cmdfile"; then 
    sh ./mno/tm.sh "$input_file" > t2.json 
fi 

Hier nehme ich auch an, dass Ihre awk und sh Skripts nicht wirklich die Ausgabe von grep benötigen, da Sie ihnen den Namen der Eingabedatei geben.

Beachten Sie, dass die richtige Verwendung von grep für die Existenzsuche über den Exitcode (und den stummgeschalteten Ausgang mit -q) erfolgt. Anstelle der if hätten wir Shortcircuit (grep ... && awk ...) verwenden können, aber dieser Weg ist wahrscheinlich besser lesbar.

+0

Danke für die Erklärung. Bitte werfen Sie einen Blick auf die cmdfile, die ich ausführen möchte. –

+0

Danke, ich habe bemerkt, dass ich grep ohne Angabe der Quelldatei ausgeführt habe. Alles funktioniert gut. –

+0

Gern geschehen, ich bin froh, dass es funktioniert! – randomir

Verwandte Themen