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

问题描述:

我有一个bash文件,提示用户输入一些参数,如果没有提供任何参数,则使用默认值。然后脚本继续执行一些其他带参数的命令。 这很好 - 直到最近的加入没有问题。如何在while循环读取行中读取用户?

在尝试从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 
} 

+0

我想看看你的其他答案这(一个告诉你如何做决定接受前_solve_的问题,它不只是什么)。 – 2012-03-13 17:05:12

您将数据传输到您的while循环STDIN中。所以readget_ans也从该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}" 
} 
+0

读了 2012-03-13 17:24:19

(注码不会复制&糊所以请原谅错别字实际的代码之前已经在main()定义的函数)当你管一个命令到另一个命令行,像:

$ foo | bar 

壳会使得bar的标准输入来自foo的标准输出进行设置。 foo发送到标准输出的任何内容将直接转到bar的标准输入。

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

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

+0

好吧,这很有道理。谢谢 – 2012-03-13 17:01:45

+0

好的,删除管道并在读取线路时使用;做...完成 2012-03-13 17:11:12

要直接从终端读取,而不是从标准输入(假设你是在* NIX机器,而不是一台Windows计算机):

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