web-dev-qa-db-fra.com

lire stdin dans la fonction dans le script bash

J'ai un ensemble de fonctions bash qui produisent des informations:

  • find-modelname-in-epson-ppds
  • find-modelname-in-samsung-ppds
  • find-modelname-in-hp-ppds
  • etc ...

J'ai écrit des fonctions qui lisent la sortie et la filtrent:

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

Mais je pensais qu'il valait mieux faire quelque chose comme ça:

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

puis appelez une autre fonction de haut niveau:

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

Comment puis-je y parvenir avec les meilleures pratiques bash?

35
likern

Si la question est How do I pass stdin to a bash function?, alors la réponse est:

Les fonctions Shellscript prennent stdin de la manière ordinaire, comme s'il s'agissait de commandes ou de programmes. :)

input.txt:

HELLO WORLD
HELLO BOB
NO MATCH

test.sh:

#!/bin/sh

myfunction() {
    grep HELLO
}

cat input.txt | myfunction

Production:

hobbes@metalbaby:~/scratch$ ./test.sh 
 HELLO WORLD 
 HELLO BOB 

Notez que les arguments de ligne de commande sont également traités de la manière habituelle, comme ceci:

test2.sh:

#!/bin/sh

myfunction() {
    grep "$1"
}

cat input.txt | myfunction BOB

Production:

hobbes@metalbaby:~/scratch/$ ./test2.sh 
 HELLO BOB 
46
daveloyall

Pour être douloureusement explicite sur le fait que je siffle depuis stdin, j'écris parfois

cat - | ...
14
glenn jackman

Appelez sed directement. C'est ça.

function filter-general {
    sed <bla-blah-blah>
}
5
John Kugelman