linux - 在 bash 中循环遍历文件中的行,而不使用标准输入

标签 linux bash shell loops

我被下面的情况搞糊涂了。

我有一个文件 list.txt,我想在 bash 中循环逐行运行它。 list.txt 中的典型行中有空格。问题是循环包含“读取”命令。我想用 bash 而不是 perl 之类的东西来写这个循环。我做不到:-(

下面是我通常会编写一个循环来逐行读取文件的方法:

while read p; do
  echo $p
  echo "Hit enter for the next one."
  read x
done < list.txt

但这不起作用,因为当然“读取 x”将从 list.txt 而不是键盘读取。

这也行不通:

for i in `cat list.txt`; do
    echo $i
    echo "Hit enter for the next one."
  read x
done

因为list.txt中的行里面有空格。

我有两个建议的解决方案,两者都很糟糕:

1) 我可以编辑 list.txt,并用 "THERE_SHOULD_BE_A_SPACE_HERE"全局替换所有空格。然后,我可以在我的循环中使用类似 sed 的东西,将 THERE_SHOULD_BE_A_SPACE_HERE 替换为一个空格,我就准备好了。我不喜欢这个,因为愚蠢的原因是,如果 list.txt 中的任何行包含短语 THERE_SHOULD_BE_A_SPACE_HERE(这样恶意用户就会把我搞砸),它将失败。

2) 我可以将 while 循环与 stdin 一起使用,然后在每个循环中我可以实际启动,例如一个新的终端,它不会受到原始 shell 中涉及 stdin 的影响。我尝试了这个并且我确实让它工作了,但是它很丑陋:我想把所有这些都包装在一个 shell 脚本中,我不希望那个 shell 脚本随机打开新窗口。如果我能弄清楚如何以某种方式在命令中调用一个新的 shell 并在不向它提供标准输入的情况下向它提供命令,那将会很好,并且可能以某种方式回答这个问题,但我无法得到它工作。例如,这不起作用,我真的不知道为什么:

while read p; do 
  bash -c "echo $p; echo ""Press enter for the next one.""; read x;"; 
done < list.txt

这个尝试似乎失败了,因为“read x”,尽管以某种方式在不同的 shell 中,但似乎仍在从 list.txt 中读取。但我觉得我可能会接近这个——谁知道呢。

帮助!

最佳答案

您必须以不同的文件描述符打开

while read p <&3; do
    echo "$p"
    echo 'Hit enter for the next one'
    read x
done 3< list.txt

更新:请忽略下面评论中冗长的讨论。它与问题或此答案无关。

关于linux - 在 bash 中循环遍历文件中的行,而不使用标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19727576/

相关文章:

linux - 在 Bash 中,如何将管道的末尾流式传输到变量中?

bash - 为什么 ~/.bash_profile 不起作用?

linux - 在linux bash中动态更改文件名

linux - Azure 云初始化 : hanging at modules-final stage

c - ENOSPC vs ENOMEM 什么时候使用?

linux - Unix shell 脚本错误

linux - 动态地将数据附加到文件

postgresql - 使用没有密码的 psql 命令运行批处理文件

Linux :Scheduling backups

linux - telnet aspmx.l.google.com 并首先尝试 ipv6