Чтение ввода в bash внутри цикла while



У меня есть сценарий bash, который является чем-то вроде следующего,



cat filename | while read line
do
read input;
echo $input;
done


но это явно не дает мне правильный вывод, так как когда я читаю в цикле while, он пытается прочитать имя файла из-за возможного перенаправления ввода-вывода.



любой другой способ сделать то же самое?

782   5  

5 ответов:

считывание с управляющего оконечного устройства:

read input </dev/tty

дополнительная информация:http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop

вы можете перенаправить обычный stdin через блок 3, чтобы сохранить его внутри трубопровода:

{ cat notify-finished | while read line; do
    read -u 3 input
    echo "$input"
done; } 3<&0

кстати, если вы действительно используете cat таким образом, замените его перенаправлением, и все станет еще проще:

while read line; do
    read -u 3 input
    echo "$input"
done 3<&0 <notify-finished

или, вы можете поменять stdin и блок 3 в этой версии -- прочитайте файл с Блоком 3, и просто оставьте stdin в покое:

while read line <&3; do
    # read & use stdin normally inside the loop
    read input
    echo "$input"
done 3<notify-finished

попробуйте изменить цикл следующим образом:

for line in $(cat filename); do
    read input
    echo $input;
done

единица тест:

for line in $(cat /etc/passwd); do
    read input
    echo $input;
    echo "[$line]"
done

похоже, что Вы читаете дважды, чтение внутри цикла while не требуется. Кроме того, вам не нужно вызывать команду cat:

while read input
do
    echo $input
done < filename
echo "Enter the Programs you want to run:"
> ${PROGRAM_LIST}
while read PROGRAM_ENTRY
do
   if [ ! -s ${PROGRAM_ENTRY} ]
   then
      echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
   else
      break
   fi
done

Comments

    Ничего не найдено.