我被下面的情况搞糊涂了。
我有一个文件 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/