如何在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
}
:
您将数据传输到您的while
循环STDIN中。所以read
get_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}"
}
读了 2012-03-13 17:24:19
(注码不会复制&糊所以请原谅错别字实际的代码之前已经在main()定义的函数)当你管一个命令到另一个命令行,像:
$ foo | bar
壳会使得bar
的标准输入来自foo
的标准输出进行设置。 foo
发送到标准输出的任何内容将直接转到bar
的标准输入。
就你而言,这意味着你的脚本可以读取的唯一东西是cat
命令的标准输出,它将包含文件的内容。
而不是在命令行中使用管道,使文件名是您的脚本的第一个参数。然后打开并读取代码中的文件,并像平常一样从用户那里读取。
好吧,这很有道理。谢谢 – 2012-03-13 17:01:45
好的,删除管道并在读取线路时使用;做...完成 2012-03-13 17:11:12
要直接从终端读取,而不是从标准输入(假设你是在* NIX机器,而不是一台Windows计算机):
while read foo</some/file; do
read bar</dev/tty
echo "got <$bar>"
done
我想看看你的其他答案这(一个告诉你如何做决定接受前_solve_的问题,它不只是什么)。 – 2012-03-13 17:05:12