2012-03-13 37 views
5

Bazı parametreler için kullanıcıyı yönlendiren ve hiçbir şey verilmediyse varsayılan değerleri kullanan bir bash dosyası vardı. Komut daha sonra parametrelerle başka komutlar gerçekleştirmek için devam etti. Bu harika çalıştı - en son eklenene kadar sorun yok.while-loop okuma satırında kullanıcıdan nasıl okunur?

Bir txt dosyasından NAMES parametresini okuma denemesinde, dosyadaki adları almak için bir while döngüsü ekledim, ancak yine de kalan parametrelerin sorulmasını istiyorum.

Ancak while döngüsünü ekledikten sonra, çıktı, get_ans() öğesinde yazdırılan istemi gösterir ve hiçbir zaman bir okuma için durur, böylece tüm varsayılanlar seçilir.

İlk parametreyi bir dosyadan, ardından gelen tüm dosyaları kullanıcıdan sormaya okumak istiyorum.

while döngüsünü ekleyerek neyi kırdım?

cat list.txt | 
while read line 
do 
    get_ans "Name" "$line" 
    read NAME < $tmp_file 

    get_ans "Name" "$line" 
    read NAME < $tmp_file 
done 

function get_ans 
{ 
    if [ -f $tmp_file ]; then 
    rm $tmp_file 

    PROMPT=$1 
    DEFAULT=$2 

    echo -n "$PROMPT [$DEFAULT]: " 
    read ans 
    if [ -z "$ans" ]; then 
    ans="$DEFAULT" 
    fi 
    echo "$ans" > $tmp_file 
} 

:

+0

Ben (biri nasıl kabul edecek bir karar vermeden önce) öyle değil sadece ne sorunu _solve_ söyleyen bir diğer cevaplar bakardık. –

cevap

3

Verileri, while döngüleri STDIN'nize aktarırsınız. Dolayısıyla get_ans'daki read da bu STDIN akışından veri almaktadır.

Sorunu önlemek ve geçici dosyaları ile rahatsız durdurmak için farklı bir dosya tanımlayıcı üzerinde süre içine boru veri olabilir:

while read -u 9 line; do 
    NAME=$(get_ans Name "$line") 
done 9< list.txt 

get_ans() { 
    local PROMPT=$1 DEFAULT=$2 ans 
    read -p "$PROMPT [$DEFAULT]: " ans 
    echo "${ans:-$DEFAULT}" 
} 
+0

, okunurken <& 9 ile anlaştı –

1

(NOT. Kod böylece yazım hataları lütfen bağışlayın & kopyalayıp yapıştırarak değil Gerçek kod main() fonksiyonu önce tanımlamıştır) Ne zaman gibi komut satırında, başka içine boru tek bir komut:

$ foo | bar 

kabuk bar ler standart çıkışa 'ın standart girdi foo geliyor' böylece kurmak için gidiyor. foo'un stdout'a gönderdiği her şey doğrudan bar'un stdin.

Sizin durumunuzda, bu, komut dosyanızın okuyabileceği tek şeyin, dosyanızın içeriğini içerecek olan cat komutunun standart çıktısı olduğu anlamına gelir.

Komut satırında bir boru kullanmak yerine, komut dosyasının komut dosyasının ilk parametresi olmasını sağlayın. Ardından, kodunuzun içindeki dosyayı açın ve okuyun ve kullanıcıdan normal olarak okuyun.

+0

Pekala, bu mantıklı. Teşekkür ederim –

+0

Tamam, boru kaldırıldı ve okunurken satır kullanılır; ... yaptım <1 $ ve hala girdi okumaları atlıyor. –

3

terminalden direk okumak için, stdin'den (bir konum varsayarak değil * NIX makinesi, bir Windows makine):

while read foo</some/file; do 
    read bar</dev/tty 
    echo "got <$bar>" 
done 
İlgili konular