我在UNIX中使用bourne shell,遇到了以下问题:
#!/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等待用户输入?
答案 0 :(得分:2)
这是因为您要求程序从文件file.txt
中读取:
done <file.txt
此外看起来你有一个拼写错误:
if [ $x = "true" ]
^^
应为"$line"
。
另请注意"
,如果没有它们,如果从文件中读取的单词中有空格,则程序将会中断。
答案 1 :(得分:2)
<file.txt
while
末尾done <file.txt
对标准输入的重定向会影响整个while
循环,包括read choice
as以及read line
。它不仅没有停止 - 它也消耗了输入文件的一行。
这是解决问题的一种方法......
您可以使用有些模糊(甚至通过shell标准)来保存原始标准输入:
exec 3<&0
打开文件描述符3以引用原始文件描述符0,它是原始标准输入。 (文件描述符0,1和2分别是标准输入,输出和错误。)然后,您可以通过执行read choice
将read choice <&3
的输入重定向到来自文件描述符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
答案 2 :(得分:0)
我没有做太多的shell脚本,但我认为“阅读选择”应该是“阅读$ choice”