2012-12-22 10 views
29

Ich habe einige Reihe von Bash-Funktionen, die Ausgabe einige Informationen:Lese stdin in Funktion in Bash-Skript

  • find-Modellname-in-epson-ppds
  • find-Modellname-in-samsung -ppds
  • find-Modellname-in-PS-ppds
  • etc ...

Ich habe Funktionen geschrieben, die Ausgabe, die sie lesen und filtern:

function filter-epson { 
    find-modelname-in-epson-ppds | sed <bla-blah-blah> 
} 

function filter-hp { 
    find-modelname-in-hp-ppds | sed <the same bla-blah-blah> 
} 
etc ... 

Aber ich dachte, dass es besser so etwas tun würde:

function filter-general { 
    (somehow get input) | sed <bla-blah-blah> 
} 

und dann in einem anderen Hoch nennen -Ebenenfunktionen:

function high-level-func { 
    # outputs filtered information 
    find-modelname-in-hp/epson/...-ppds | filter-general 
} 

Wie erreiche ich das mit den besten Bashpraktiken?

+0

Wenn Sie für eine gute Praxis suchen, können Sie bereits ersetzen 'Funktion fname' mit' fname() '. –

+1

Was ist der Unterschied? Nur die Kürze? Aber ich denke, Definition mit 'Funktion' sieht ausdrucksvoller aus, nicht wahr? – likern

+1

Was meinst du mit _more expressive_? In [dieser Link] (http://wiki.bash-hackers.org/scripting/obsolete) sehen Sie, dass es veraltet und veraltet ist (und nicht POSIX). –

Antwort

34

schreiben Wenn die Frage How do I pass stdin to a bash function? ist, dann ist die Antwort:

Shell Funktionen übernehmen stdin die gewöhnliche so, als wären sie Befehle oder Programme. :)

input.txt:

HELLO WORLD 
HELLO BOB 
NO MATCH 

test.sh:

#!/bin/sh 

myfunction() { 
    grep HELLO 
} 

cat input.txt | myfunction 

Ausgang:

[email protected]:~/scratch$ ./test.sh 
HELLO WORLD 
HELLO BOB 

Beachten Sie, dass Zeilenargumente geboten ist auch in der gewöhnlichen Art und Weise behandelt, so:

test2.sh:

#!/bin/sh 

myfunction() { 
    grep "$1" 
} 

cat input.txt | myfunction BOB 

Ausgang:

[email protected]:~/scratch/$ ./test2.sh 
HELLO BOB 
+0

Dies funktioniert nicht auf bash 4.1.0. Ich bekomme die Ausgabe: "Hallo Welt \ n Hallo BOB \ n keine Übereinstimmung" – DocSalvager

+0

Ok, es ist wegen meiner Verwendung von '\ n' in der Eingabe-String. Ich habe die Antwort bearbeitet; Es wird nun einfach eine Eingabedatei verwendet, um der Einfachheit zu entsprechen. Diese Frage bezieht sich auf den Zugriff auf 'stdin' von einer Funktion - und dieser Teil funktioniert sogar in bash 2.05b. :) – daveloyall

+1

Ah, ja ... weil Echo Escapesequenzen nicht unterstützt. Eine weitere Möglichkeit, dies zu umgehen, ist eine Variable wie NL = "" zu definieren und "\ n" durch "$ NL" zu ersetzen. Arbeite jetzt. Vielen Dank! – DocSalvager

5

Rufen Sie sed direkt an. Das ist es.

function filter-general { 
    sed <bla-blah-blah> 
} 
10

schmerzlich explizit sein, dass ich Rohrleitungen von stdin bin ich manchmal

cat - | ... 
+0

In meinem Fall musste ich tatsächlich "schmerzhaft explizit" sein, sonst hat es nicht funktioniert. – Mahdi

+0

@Mahdi Was meinst du? Gibt es da draußen Muscheln, die in diesem Fall/Kontext den Einsatz von 'cat -' erfordern? Welche? Wann? Wie? –

+0

Ich habe ein Skript, das als Mapper in einem Hadoop-Map-Reduce-Job ausgeführt wird, und die Eingabeinhalte werden mir über Stdin übergeben. Ich musste die gesamte Eingabe in eine Datei für die weitere Verarbeitung lesen, und diese Lösung funktionierte für mich. – Mahdi