我正在尝试将file2
的内容与file1
的内容进行比较,并根据我需要采取的措施。
但是当我尝试从用户(在变量answer
中)获取是否启动时,程序不会等待用户输入并自动将值赋值给变量line
。
#!/bin/bash
while read line;
do
var=`grep $line file1.txt`
if [ -z "$var"]
then
echo "$line is not running"
echo "Do you want to start? (Y/N)"
read answer
if [ "$answer" = 'Y' ] || [ "$answer" = 'N' ]
then
if [ "$answer" = 'Y' ]
then
(some action)
else
(action)
fi
else
(action)
fi
fi
done < file2
答案 0 :(得分:2)
您将while
循环的stdin重定向到file2
。因此,在循环内部,stdin
被重定向,read
将从文件中读取,而不是从终端读取。
使用bash
,您可以使用不同的文件描述符轻松解决此问题:
while read -r -u3 line; do
echo "$line"
read -p "Continue? " yesno
if [[ $yesno != [Yy]* ]]; then break; fi
done 3<file2
-u3
的{{1}}命令行标记使其从fd 3读取,而read
重定向将fd 3重定向到3<file2
(打开file
阅读)。
答案 1 :(得分:0)
@rici提供的优秀答案的另一种方法,这次不需要bash:
while read -r line <&3; do
echo "$line"
printf "Continue? " >&2
read yesno
case $yesno in
[Yy]*) : ;;
*) break ;;
esac
done 3<file2
使用来自FD 3的read <&3
次读取,就像bash扩展名read -u 3
一样。