我有一个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()
您将数据传输到while
循环STDIN中。 所以get_ans
的read
也是从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
命令的标准输出,它将包含你的文件的内容。
而不是在命令行中使用管道,使文件名是您的脚本的第一个参数。 然后打开并读取代码中的文件,并像往常一样从用户那里读取。