Search code examples
bashshellpipebash-function

read stdin in function in bash script


I have some set of bash functions which output some information:

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

I've been writing functions which read output and filter it:

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

But the I thought that it would be better do something like this:

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

and then call in another high-level functions:

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

How can I achieve that with the best bash practices?


Solution

  • If the question is How do I pass stdin to a bash function?, then the answer is:

    Shellscript functions take stdin the ordinary way, as if they were commands or programs. :)

    input.txt:

    HELLO WORLD
    HELLO BOB
    NO MATCH
    

    test.sh:

    #!/bin/sh
    
    myfunction() {
        grep HELLO
    }
    
    cat input.txt | myfunction
    

    Output:

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

    Note that command line arguments are ALSO handled in the ordinary way, like this:

    test2.sh:

    #!/bin/sh
    
    myfunction() {
        grep "$1"
    }
    
    cat input.txt | myfunction BOB
    

    Output:

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