如何在while循环读取行内读取用户?

我有一个bash文件,提示用户input一些参数,如果没有提供,使用默认值。 然后脚本继续执行其他一些带有参数的命令。 这工作很好 – 直到最近join没有问题。

在尝试从txt文件中读取NAMES参数时,我添加了一个while循环来获取文件中的名称,但我仍然希望提供其余的参数。

但是,一旦我添加了while循环,输出将显示get_ans()中的打印提示,并且从不会暂停读取,因此所有默认值都将被选中。

我想从文件中读取第一个参数,然后从提示用户读取所有后续文件。

我通过添加while循环来破解了什么?

cat list.txt | while read line do get_ans "Name" "$line" read NAME < $tmp_file get_ans "Name" "$line" read NAME < $tmp_file done function get_ans { if [ -f $tmp_file ]; then rm $tmp_file PROMPT=$1 DEFAULT=$2 echo -n "$PROMPT [$DEFAULT]: " read ans if [ -z "$ans" ]; then ans="$DEFAULT" fi echo "$ans" > $tmp_file } 

(注意:代码不能复制粘贴,请原谅错字。实际代码在main()

Solutions Collecting From Web of "如何在while循环读取行内读取用户?"

您将数据传输到while循环STDIN中。 所以get_ansread也是从STDIN流中获取数据。

您可以在不同的文件描述符中传输数据,以避免出现问题,并停止使用临时文件:

 while read -u 9 line; do NAME=$(get_ans Name "$line") done 9< list.txt get_ans() { local PROMPT=$1 DEFAULT=$2 ans read -p "$PROMPT [$DEFAULT]: " ans echo "${ans:-$DEFAULT}" } 

直接从终端阅读,而不是从标准输入(假设你在* NIX机器,而不是Windows机器):

 while read foo</some/file; do read bar</dev/tty echo "got <$bar>" done 

当您在命令行中将一个命令传送到另一个命令时,如:

 $ foo | bar 

shell将设置它,以便bar的标准输入来自foo的标准输出。 foo发送到标准输出的任何东西都会直接进入标准输入。

在你的情况下,这意味着你的脚本可以读取的唯一东西是cat命令的标准输出,它将包含你的文件的内容。

而不是在命令行中使用管道,使文件名是您的脚本的第一个参数。 然后打开并读取代码中的文件,并像往常一样从用户那里读取。