2013-05-01 26 views
0

我在shell脚本(BASH)中使用“while”循环来读取一行文件文件(一个接一个) - “幸运的是,它不工作的次数文件中有线。WHILE循环 - 逐一读取文件的行 - 不工作文件中有行的次数

这里的总结: $猫inputfile.txt

1 
2 
3 
4 
5 

现在,shell脚本的内容很简单,如下图所示:

#!/bin/bash 

while read line 
do 
echo $line ----------; 
done < inputfile.txt; 

上述脚本代码工作就好了.. ... :)。它显示来自inputfile.txt的所有5行。



现在,我有另一个脚本其代码是这样的:

#!/bin/bash 

while read line 
do 
echo $line ----------; 

somevariable="$(ssh [email protected] "hostname")"; 
echo $somevariable; 

done < inputfile.txt; 

现在,在这个脚本,while循环只是只显示一行“1 ------- - “并在显示”$ somevariable“的有效值后从循环退出

任何想法,我在这里失踪。我没有尝试使用一些编号N < inputfile.txt并使用完成< & N方式(即通过使用N描述符指向的文件更改输入重定向器) ....但我很好奇为什么这个简单的脚本不适用于N号。的时候,当我刚刚添加一个简单的变量声明,在子shell中执行“ssh”操作。

谢谢。

+0

难道说你的返回值'$ somevariable'包含EOF标记类型(^ d)? – Floris 2013-05-01 23:41:00

+0

重复[http://stackoverflow.com/questions/16094925/bash-script-fails-to-read-entire-file](http://stackoverflow.com/questions/16094925/bash-script-fails-to -read-entire-file) – 2013-05-02 05:06:41

回答

3

您可能需要将-n选项添加到ssh命令中。这将阻止它“吞下”inputfile.txt作为其标准输入。

或者,你可能只是重定向SSH标准输入从/ dev/null的,如:

somevariable="$(ssh [email protected] "hostname" </dev/null)"; 
+0

似乎很可能。你的ssh会话与while循环共享stdin。请注意,像这样重定向的bash循环将成为一个带有自己stdin/stdout等流的新进程 - 以便您可以重定向它们。 – rivimey 2013-05-02 00:27:49

+0

@rivimey:它不会成为一个新的过程。 while循环由同一个shell执行。 – jlliagre 2013-05-02 06:04:35

+0

谢谢你Jlliagre。有效。很高兴知道。 – 2013-05-02 14:32:38