linux - 如何在 while-loop 读取行中读取用户?

标签 linux bash while-loop

我有一个 bash 文件,它提示用户输入一些参数,如果没有给出则使用默认值。然后脚本继续使用参数执行其他一些命令。 这很好用——在最近添加之前没有问题。

在尝试从 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 中,以避免出现此问题并停止使用临时文件:

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}"
}

关于linux - 如何在 while-loop 读取行中读取用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9688371/

相关文章:

c++ - 在 C++ 中使用 delete 时出现段错误

php - 重新启动 While 循环

JAVA,Switch case需要两个条目才能工作

python - 输入数字500以下的最大幂

linux - Linux下的静态库安装——应该和动态库安装类似吗?

java - 如何在 Ubuntu 15.04 上的 Tomcat 上更新 JAVA_HOME/JRE_HOME?

linux - 如何通过用户数据在 EC2 实例上设置环境变量

linux - 如何在 Linux Shell 中显示出现在连续行中的日期差异?

python - 每个 arg 具有多个值的 arg 解析器的最佳实践

linux - 在启动 linux 时运行 jar 文件