shell - 在 bourne 脚本中重定向标准输入后获取用户输入

标签 shell sh

(这间接地是更大的家庭作业的一部分)

我有类似的东西

在阅读 LINE 时

事情完成到$LINE
echo "输入输入:"
读取输入
完成到 $INPUT 的事情
完成
我找不到使用控制台/默认标准输入进行第二次读取的成功方法,而不是重定向的标准输入。

需要是纯伯恩脚本。

最佳答案

我相信这在 Bourne shell 中得到支持:

exec 3<doc.txt
while read LINE <&3
do
    stuff-done-to-$LINE
    # the next two lines could be replaced by: read -p "Enter input: " INPUT
    echo "Enter input:"
    read INPUT
    stuff-done-to-$INPUT
done < infile

输入在文件和用户之间交替。事实上,这将是一种从文件中发出一系列提示的巧妙方法。

这会将文件“infile”重定向到第一个 read 的文件描述符编号 3。得到它的输入。文件描述符 0 为 stdin , 1 是 stdout和 2 是 stderr .您可以与它们一起使用其他 FD。

我已经在 Bash 和 Dash 上对此进行了测试(在我的系统上,sh 符号链接(symbolic link)到 dash)。

当然可以。这里有一些更有趣的:
exec 3<doc1.txt
exec 4<doc2.txt
while read line1 <&3 && read line2 <&4
do
    echo "ONE: $line1"
    echo "TWO: $line2"
    line1=($line1) # convert to an array
    line2=($line2)
    echo "Colors: ${line1[0]} and ${line2[0]}"
done

这交替打印两个文件的内容,丢弃较长文件的多余行。
ONE: Red first line of doc1
TWO: Blue first line of doc2
Colors: Red and Blue
ONE: Green second line of doc1
TWO: Yellow second line of doc2
Colors: Green and Yellow

Doc1 只有两行。 doc2 的第三行和后续行被丢弃。

关于shell - 在 bourne 脚本中重定向标准输入后获取用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385380/

相关文章:

python - 如何用纯 Python 表达这个 Bash 命令

mongodb - 如何通过shell脚本执行mongo命令?

Bash 脚本检查 cmd 的输出是否在一段时间内增加,如果是则运行

linux换到another/dev/ttyX并在那里运行程序

c - 如何防止在 fgets 中回显一些字符

linux - 如何知道PPTP服务器自动分配的LAN中的PPTP客户端本地IP?

linux - sed命令删除一行

linux - .bashrc for/bin/sh 有替代方案吗?

Linux cp 命令保存文件结构

bash - Dockerfile CMD 指令将在运行后立即退出容器