while循环的输入来自`command`的输出

时间:2010-06-06 05:32:46

标签: shell loops while-loop

#I used to have this, but I don't want to write to the disk
#
pcap="somefile.pcap"
tcpdump -n -r $pcap > all.txt
while read line; do  
  ARRAY[$c]="$line"
  c=$((c+1))  
done < all.txt  

以下无效。

# I would prefer something like...
#
pcap="somefile.pcap"
while read line; do  
  ARRAY[$c]="$line"
  c=$((c+1))  
done < $( tcpdump -n -r "$pcap" )

Google上的结果太少(不明白我想要找到的内容:()。我想保持Bourne兼容(/ bin / sh),但它不会拥有 to be。

4 个答案:

答案 0 :(得分:20)

这是sh - 兼容:

tcpdump -n -r "$pcap" | while read line; do  
  # something
done

但是,sh没有数组,因此您无法使用sh中的代码。其他人都说正确的bashperl现在相当普遍,你可以指望他们可以在非古代系统上使用。

更新以反映@Dennis的评论

答案 1 :(得分:15)

这适用于bash:

while read line; do  
  ARRAY[$c]="$line"
  c=$((c+1))  
done < <(tcpdump -n -r "$pcap")

答案 2 :(得分:1)

如果您不关心bourne,可以切换到Perl:

my $pcap="somefile.pcap";
my $counter = 0;
open(TCPDUMP,"tcpdump -n -r $pcap|") || die "Can not open pipe: $!\n";
while (<TCPDUMP>) {
    # At this point, $_ points to next line of output
    chomp; # Eat newline at the end
    $array[$counter++] = $_;
}

或者在shell中,使用for

for line in $(tcpdump -n -r $pcap)  
do  
 command  
done  

答案 3 :(得分:1)

for line in $(tcpdump -n -r $pcap)  
do  
 command  
done 

这并不完全符合我的需要。但它很接近。和Shell兼容。我正在从tcpdump输出创建HTML表。 for循环生成一个新的&lt; tr&gt;每个单词的行。它应为每个(\ n结尾)创建一个新行。 Paste bin script01.sh