重击:在读取循环中读取输入无效


14

在while读取循环中读取输入似乎不起作用

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

执行不会像读取循环外那样暂停。为什么是这样?有没有一种解决方法可以在while读取循环中读取输入?

Answers:


15

问题是,无论是read lineread response预期(并得到)的数据stdin。关于SO的
这个问题用指向更多信息的链接解释了其中的一些问题

tl; dr
接受的答案表明:

从控制终端设备读取: read input </dev/tty


16

让内部读取命令使用stdin,并为while循环使用其他文件描述符

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

1

Nifle完全正确。但是,当您使用多个终端时,需要具体说明。

对于那些来自Google的人,恭喜您找到此页面。如果您需要同时读取循环过程中做任何用户输入(这包括rm -iread或其他任何东西),你可以指定哪些输入管道使用。

这是我使用的此解决方案的一部分:

#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

谢谢Nifle!同时还要感谢bgStack。经过几个小时的搜索,我终于得到了答案!很棒的一个!我使用“ echo $(tty)”来检测我的终端路径,或者只是将其视为变量。对我来说,这是另一个用例。U正在读取文件,并希望确认执行。也许下面的例子可以帮助其他人。

#!/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

在我的情况下,我while从管道中读取...,然后使用重定向从stdin中读取:read something < %terminal
eftshift0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.