2012-12-22 8 views
29

ben bash işlevlerinin bazı kümesine sahip olan çıkış bazı bilgiler:okuma Stdin

  • bulmak-ModelAdı-in-epson-PPD
  • bulmak-ModelAdı-in-samsung -ppds
  • bulmak-ModelAdı-in-hp-PPD
  • vs ...

Ben çıktı okumak işlevleri yazma ve bunu filtre ettik:

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

Ama daha iyi böyle bir şey yapacağını düşündüm:

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

ve daha sonra başka yüksek aramak -level fonksiyonları:

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

Bunu en iyi bash uygulamalarıyla nasıl başarabilirim?

+0

, zaten ('fname ile' fonksiyon fname' yerini alabilir) '. –

+1

Fark nedir? Sadece kıskançlık? Ama ben 'function' ile tanımın daha etkileyici olduğunu düşünüyorum, değil mi? – likern

+1

_more expressive_ ile ne demek istiyorsun? [Bu link] 'de (http://wiki.bash-hackers.org/scripting/obsolete) eskimiş olduğunu ve kullanımdan kaldırıldığını göreceksiniz (POSIX değil). –

cevap

34

yazma soru How do I pass stdin to a bash function? o zaman cevap ise

function filter-general { 
    sed <bla-blah-blah> 
} 
+0

Bu, bash 4.1.0 üzerinde çalışmıyor. Çıktıyı alıyorum: "HELLO WORLD \ n HELLO BOB \ N NO MATCH" – DocSalvager

+0

Tamam, giriş dizesinde '\ n' kullanımı nedeniyle. Cevabı düzenledim; Şimdi basitlik uğruna sadece bir girdi dosyası kediler. Bu soru 'stdin' işlevine erişmekten ibarettir ve bu bölüm bash 2.05b'de bile çalışır. :) – daveloyall

+1

Ah, evet ... çünkü echo kaçış sıralarını desteklemiyor. Bunun üstesinden gelmenin başka bir yolu, NL = " buraya" gibi bir değişken tanımlamak ve "\ n" yerine "$ NL" ile değiştirmek. Şimdi çalışıyor. Teşekkürler! – DocSalvager

5

Doğrudan sed numaralı telefonu arayın. Bu kadar.

shellscript fonksiyonları sıradan stdin'i atın: Ben bazen

cat - | ... 
10

ben stdin'den boru olduğumu acı açık olmak gerekirse şekilde, komutlar ya da programlarmış gibi. :)

girdi.txt:

HELLO WORLD 
HELLO BOB 
NO MATCH 

test.sh:

#!/bin/sh 

myfunction() { 
    grep HELLO 
} 

cat input.txt | myfunction 

Çıktı: AYRICA sıradan şekilde ele alınır hat argümanları komut

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

Not bunun gibi:

test2.sh:

#!/bin/sh 

myfunction() { 
    grep "$1" 
} 

cat input.txt | myfunction BOB 

Çıktı:

Eğer iyi uygulama arıyorsanız
[email protected]:~/scratch/$ ./test2.sh 
HELLO BOB 
+0

Benim durumumda, aslında "acımasızca açık" olmalıydım, aksi halde işe yaramadı. – Mahdi

+0

@Mahdi Ne demek istiyorsun? Bu durumda/bağlamında "kedi" kullanımını gerektiren kabuklar var mı? Hangi? Ne zaman? Nasıl? –

+0

Hadoop harita küçültme işinde bir eşleştirici olarak çalışan bir komut dosyası var ve giriş içeriği bana stdin aracılığıyla veriliyor. Bütün girdileri daha fazla işlem için bir dosyaya okumam gerekiyordu ve bu çözüm benim için çalıştı. – Mahdi