2012-03-13 41 views
5

Tôi có một tệp bash đã nhắc người dùng về một số tham số và sử dụng mặc định nếu không có gì được cung cấp. Kịch bản sau đó tiếp tục thực hiện một số lệnh khác với các tham số. Điều này làm việc tuyệt vời - không có vấn đề cho đến khi bổ sung gần đây nhất.Làm thế nào để đọc từ người dùng trong vòng lặp while-loop?

Trong nỗ lực đọc tham số NAMES từ tệp txt, tôi đã thêm một vòng lặp while để lấy tên trong tệp, nhưng tôi vẫn muốn các tham số còn lại được nhắc.

Nhưng một khi tôi thêm vòng lặp while, sản lượng cho thấy dấu nhắc in get_ans() và không bao giờ dừng lại để đọc lại, do đó tất cả các giá trị mặc định được chọn.

Tôi muốn đọc các tham số đầu tiên từ một tập tin, sau đó tất cả các file tiếp theo từ khiến người sử dụng.

Tôi đã làm gì bằng cách thêm vòng lặp while?

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 
} 

(Chú ý:. Mã không được sao chép & dán vì vậy hãy tha lỗi chính tả đang thực tế có chức năng xác định trước khi chính())

+0

Tôi sẽ xem xét các câu trả lời khác của bạn (một trong số đó cho bạn biết cách giải quyết vấn đề, không chỉ là vấn đề) trước khi quyết định chấp nhận. –

Trả lời

3

Bạn ống dữ liệu vào của bạn while vòng STDIN. Vì vậy, read trong get_ans cũng đang lấy dữ liệu từ luồng STDIN đó.

Bạn có thể dữ liệu ống vào trong khi trên một mô tả tập tin khác nhau để tránh vấn đề này và đừng làm phiền với các tập tin tạm thời:

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

đã đọc trong khi đọc <& 9 –

1

Khi bạn ống một lệnh vào khác trên dòng lệnh, như:

$ foo | bar 

vỏ sẽ thiết lập nó để bar 'đầu vào tiêu chuẩn s đến từ foo' đầu ra tiêu chuẩn s. Bất cứ điều gì mà foo gửi đến stdout sẽ đi trực tiếp đến st2 bar 's.

Trong trường hợp của bạn, điều này có nghĩa là điều duy nhất mà tập lệnh của bạn có thể đọc là đầu ra tiêu chuẩn của lệnh cat, sẽ chứa nội dung tệp của bạn.

Thay vì sử dụng một ống trên dòng lệnh, làm cho tên tập tin là tham số đầu tiên của kịch bản của bạn. Sau đó mở và đọc từ tệp bên trong mã của bạn và đọc từ người dùng như bình thường.

+0

Được rồi, điều đó có ý nghĩa. Cảm ơn bạn –

+0

Được rồi, đã tháo đường ống và sử dụng khi đọc dòng; làm ... thực hiện <$ 1 và nó vẫn còn bỏ qua lần đọc đầu vào. –

3

Để đọc trực tiếp từ thiết bị đầu cuối, không phải từ stdin (giả sử bạn đang ở trên một * Máy NIX, không phải máy Windows):

while read foo</some/file; do 
    read bar</dev/tty 
    echo "got <$bar>" 
done 
Các vấn đề liên quan