web-dev-qa-db-ja.com

bashスクリプトの関数の標準入力を読み取ります

いくつかの情報を出力するbash関数のセットがあります。

  • find-modelname-in-epson-ppds
  • find-modelname-in-samsung-ppds
  • find-modelname-in-hp-ppds
  • など...

私は出力を読み取り、それをフィルタリングする関数を書いてきました:

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

しかし、私はそれがこのようなことをする方が良いと思った:

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

次に、別の高レベル関数を呼び出します。

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

Bashのベストプラクティスを使用してそれを実現するにはどうすればよいですか?

35
likern

質問がHow do I pass stdin to a bash function?、それから答えは:

シェルスクリプト関数は、コマンドまたはプログラムであるかのように、通常の方法で標準入力を取ります。 :)

input.txt:

HELLO WORLD
HELLO BOB
NO MATCH

test.sh:

#!/bin/sh

myfunction() {
    grep HELLO
}

cat input.txt | myfunction

出力:

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

コマンドライン引数も、次のように通常の方法で処理されることに注意してください。

test2.sh:

#!/bin/sh

myfunction() {
    grep "$1"
}

cat input.txt | myfunction BOB

出力:

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

私が標準入力からパイプしていることを痛々しいほど明確にするために、私は時々書く

cat - | ...
14
glenn jackman

sedを直接呼び出します。それでおしまい。

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