Почему я не могу правильно прочитать пользовательский ввод в цикле UNIX while? - PullRequest
1 голос
/ 22 октября 2010

Я использую оболочку Bourne в UNIX и сталкиваюсь со следующей проблемой:

#!/bin/sh


while read line
   do

  echo $line

  if [ $x = "true" ]
  then
        echo "something"
        read choice
        echo $choice
  else
        echo "something"
  fi

done <file.txt

Проблема, с которой я столкнулся, заключается в том, что UNIX не будет ждать ввода данных пользователем в команде чтения - этопросто пропускает вместо ожидания того, что наберет пользователь. Как я могу заставить unix ждать ввода пользователя?

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Это потому, что вы просите программу прочитать файл file.txt:

done <file.txt

Также похоже, что у вас есть опечатка:

if [ $x = "true" ]
     ^^

, которая должна быть"$line".
Также обратите внимание на ", без них ваша программа сломается, если слово, прочитанное из файла, будет содержать пробел.

2 голосов
/ 22 октября 2010

Перенаправление стандартного ввода <file.txt в конце while ... done <file.txt влияет на весь цикл while, включая read choice, а также read line.Он не просто не останавливается - он также потребляет строку вашего входного файла.

Вот один из способов решения проблемы ...

Вы можете сохранить исходный стандартный ввод, используя нескольконеясен (даже по стандартам оболочки):

exec 3<&0

, который открывает дескриптор файла 3 для ссылки на исходный дескриптор файла 0, который является исходным стандартным вводом.(Файловые дескрипторы 0, 1 и 2 являются стандартным вводом, выводом и ошибкой соответственно.) А затем вы можете перенаправить только ввод read choice для получения из дескриптора файла 3, выполнив read choice <&3.

Завершить работусценарий (я не был уверен, откуда взялся x, поэтому я просто набил его, чтобы он заработал):

#!/bin/sh

x=true  # to make the example work

exec 3<&0

while read line
   do

  echo $line

  if [ $x = "true" ]
  then
        echo "something"
        read choice <&3
  else
        echo "something"
  fi

done <file.txt
0 голосов
/ 22 октября 2010

Я не делаю много сценариев оболочки, но я думаю, что «выбор чтения» должен быть «чтение $ выбор»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...