Bash: membaca input di dalam sementara loop baca tidak bekerja


14

Input pembacaan dalam loop pembacaan sementara sepertinya tidak berfungsi

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

eksekusi tidak berhenti seperti itu akan dibaca di luar loop. Kenapa ini? Apakah ada solusi untuk membaca input dalam loop saat membaca?

Jawaban:


15

Masalahnya adalah bahwa kedua read linedan read responsemengharapkan (dan mendapat) data dari stdin.
Pertanyaan tentang SO ini menjelaskan beberapa di antaranya dengan tautan ke informasi yang lebih banyak lagi.

tl; dr
Jawaban yang diterima menyarankan:

Baca dari perangkat terminal pengendali: read input </dev/tty


16

biarkan perintah read dalam menggunakan stdin, dan gunakan deskriptor file yang berbeda untuk loop while

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

1

Nifle benar sekali. Ketika Anda menggunakan beberapa terminal, Anda harus spesifik.

Bagi Anda yang berasal dari google, selamat telah menemukan halaman ini. Jika Anda perlu melakukan input pengguna selama while read (termasuk rm -i, read, atau apa pun), Anda dapat menentukan masukan pipa untuk digunakan.

Inilah sebagian dari solusi ini yang saya gunakan:

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

1

Terima kasih, Nifle! Dan juga terima kasih kepada bgStack. Setelah mencari selama berjam-jam akhirnya saya mendapat jawabannya! Bagus !! Saya menggunakan "echo $ (tty)" untuk mendeteksi jalur terminal saya atau Anda hanya menganggapnya sebagai variabel. Bagi saya itu adalah kasus penggunaan lainnya. U sedang membaca file dan ingin mengkonfirmasi eksekusi. Mungkin contoh di bawah ini membantu orang lain.

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

Dalam kasus saya saya harus whilemembaca dari pipa ... dan kemudian saya menggunakan redirection untuk membaca dari stdin: read something < %terminal.
eftshift0
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.