2012-12-22 58 views
29

我有一些組的bash功能,這輸出一些信息:讀取標準輸入函數在bash腳本

  • 發現,MODELNAME功能於EPSON-PPDS
  • 發現,MODELNAME功能於三星-ppds
  • 發現,MODELNAME式-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實踐?

+0

如果你正在尋找好的做法,你已經可以用'FNAME替換'功能fname'()'。 –

+1

有什麼區別?只是簡潔?但我認爲用'function'定義看起來更有表現力,不是嗎? – likern

+1

你是什麼意思_更富表現力_?在[這個鏈接](http://wiki.bash-hackers.org/scripting/obsolete)中,你會發現它已經過時並且被棄用(而不是POSIX)。 –

回答

34

如果問題是How do I pass stdin to a bash function?,那麼答案是:

shell腳本函數接受標準輸入普通就好像它們是命令或程序一樣。 :)

input.txt中:

HELLO WORLD 
HELLO BOB 
NO MATCH 

test.sh:

#!/bin/sh 

myfunction() { 
    grep HELLO 
} 

cat input.txt | myfunction 

輸出:

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

注意,命令行參數在普通方式也處理,像這樣:

test2.sh:

#!/bin/sh 

myfunction() { 
    grep "$1" 
} 

cat input.txt | myfunction BOB 

輸出:

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

這不適用於bash 4.1.0。我得到輸出結果:「HELLO WORLD \ n HELLO BOB \ n NO MATCH」 – DocSalvager

+0

好吧,這是因爲我在輸入字符串中使用了'\ n'。我編輯了答案;爲簡單起見,它現在只是輸入一個輸入文件。這個問題是關於從一個函數訪問'stdin'的 - 而且這個部分即使在bash 2.05b中也可以工作。 :) – daveloyall

+1

啊,是的......因爲echo不支持轉義序列。另一種處理方法是定義一個變量,如NL =「」,並用「$ NL」替換「\ n」。現在工作。謝謝! – DocSalvager

5

直接致電sed。而已。

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

要痛苦明確,我是從標準輸入管道,我有時候寫

cat - | ... 
+0

就我而言,確實我需要「非常明確」,否則它就無法工作。 – Mahdi

+0

@Mahdi你是什麼意思?在這種情況下,有沒有需要使用'cat -'的shell?哪一個?什麼時候?怎麼樣? –

+0

我有一個在Hadoop map-reduce作業中作爲映射器運行的腳本,輸入內容通過stdin提供給我。我需要將整個輸入讀入文件以供進一步處理,並且此解決方案適用於我。 – Mahdi