2012-12-22 15 views
29

Mam zestaw funkcji bash, które wyjście niektóre informacje:odczytu stdin w funkcji w skrypcie bash

  • find-MODELNAME-in-Epson PPD
  • find-MODELNAME-in-samsung -ppds
  • find-MODELNAME-in-HP-PPD
  • etc ...

Pisałem funkcje, które czytają wyjście i filtrować go:

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 ... 

Ale myślałem, że lepiej byłoby zrobić coś takiego:

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

a następnie wywołać w inny wysoki -level:

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

Jak mogę to osiągnąć przy najlepszych praktykach bash?

+0

Jeśli szukasz dobrej praktyki, można już zastąpić 'function fname' z' fname() '. –

+1

Jaka jest różnica? Tylko zwięzłość? Ale myślę, że definicja z "funkcją" wygląda bardziej ekspresywnie, prawda? – likern

+1

Co rozumiesz przez _więcej ekspresywnego? W [ten link] (http://wiki.bash-hackers.org/scripting/obsolete) zobaczysz, że jest przestarzały i przestarzały (a nie POSIX). –

Odpowiedz

34

Jeśli pytanie jest How do I pass stdin to a bash function?, to odpowiedź brzmi:

funkcje Shellscript wziąć stdin niezwykłego sposób, jakby były poleceniami lub programami. :)

input.txt:

HELLO WORLD 
HELLO BOB 
NO MATCH 

test.sh:

#!/bin/sh 

myfunction() { 
    grep HELLO 
} 

cat input.txt | myfunction 

wyjściowa:

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

Należy zauważyć, że argumenty wiersza polecenia są również obsługiwane w zwykły sposób, tak:

test2.sh:

#!/bin/sh 

myfunction() { 
    grep "$1" 
} 

cat input.txt | myfunction BOB 

wyjściowa:

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

To nie działa na bashu 4.1.0. Otrzymuję wynik: "HELLO WORLD \ n HELLO BOB \ n NO MATCH" – DocSalvager

+0

OK, to z powodu mojego użycia '\ n' w łańcuchu wejściowym. Edytowałem odpowiedź; teraz po prostu koty plik wejściowy, ze względu na prostotę. To pytanie dotyczy dostępu do 'stdin' z funkcji - i ta część działa nawet w bash 2.05b. :) – daveloyall

+1

Ah, tak ... ponieważ echo nie obsługuje sekwencji ucieczki. Innym sposobem radzenia sobie z tym jest zdefiniowanie zmiennej, takiej jak NL = "" i zastąpienie "\ n" przez "$ NL". Teraz pracuje. Dzięki! – DocSalvager

5

Zadzwoń pod sed bezpośrednio. to jest to!

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

Aby być boleśnie wyraźne, że jestem orurowanie ze standardowego wejścia, czasami napisać

cat - | ... 
+0

W moim przypadku rzeczywiście musiałem być "boleśnie jednoznaczny", w przeciwnym razie nie działało. – Mahdi

+0

@Mahdi Co masz na myśli? Czy są tam powłoki, które wymagają użycia 'cat -' w tym przypadku/kontekście? Który? Gdy? W jaki sposób? –

+0

Mam skrypt, który działa jako program odwzorowujący w mapach Hadoop - zmniejsz liczbę zadań, a zawartość wejściowa jest przekazywana do mnie przez stdin. Musiałem przeczytać cały wkład w pliku do dalszego przetwarzania, a to rozwiązanie sprawdziło się. – Mahdi

Powiązane problemy