Чтение ввода в bash внутри цикла while
У меня есть сценарий bash, который является чем-то вроде следующего,
cat filename | while read line
do
read input;
echo $input;
done
но это явно не дает мне правильный вывод, так как когда я читаю в цикле while, он пытается прочитать имя файла из-за возможного перенаправления ввода-вывода.
любой другой способ сделать то же самое?
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