Перенаправление стандартного ввода <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