这个bash for loop语句是否正确?

时间:2014-04-23 17:28:59

标签: bash for-loop

以下是代码:

totLines=$(wc -l < extractedips.txt)
for((a=0;a!=$totLines;a++))
{
  head -n$a extractedips.txt | nslookup >> ip_extracted.txt
}

我不确定我做错了什么。

3 个答案:

答案 0 :(得分:4)

是的!尽管人们在说什么,但这是一个有效的bash for循环!

但请注意,它是bash扩展名。它不是有效的sh for循环。你不能在这种形式的循环中使用这种形式。使用#!/bin/sh声明的shell脚本或使用sh yourscript运行的shell脚本。

不起作用的是你的for循环内容。

  1. 您尝试获取第n行,但head -n 42获得前42行,而不是第42行。
  2. 您使用的是基于0的索引,而head是基于1的。
  3. 您正在使用nslookup,但nslookup需要一个参数而不是stdin。
  4. 对您的问题的最短修复是:

    totLines=$(wc -l < extractedips.txt)
    for ((a=1; a<=totLines; a++)); do
        nslookup "$(head -n "$a" extractedips.txt | tail -n 1)" >> ip_extracted.txt
    done
    

    但是,更有效和规范的方法是使用while循环:

    while IFS= read -r line
    do
      nslookup "$line"
    done  < extractedips.txt  > ip_extracted.txt
    

答案 1 :(得分:1)

您应该使用dodone代替花括号。

像这样:

totLines=$(wc -l < extractedips.txt)
for ((a=0; a!=totLines; a++)); do
    head -n "$a" extractedips.txt | nslookup >> ip_extracted.txt
done

然而,这段代码会做一些奇怪的事情......你是否想逐行将它传递给nslookup?

这个怎么样?

nslookup < extractedips.txt > ip_extracted.txt

或者你可能想要这个:

while read -r line; do
    nslookup "$line" >> ip_extracted.txt
done < extractedips.txt

答案 2 :(得分:-3)

看起来你需要某事。像这样

for i in $(cat extractedips.txt)
do
echo $i | nslookup >> ip_extracted.txt
done

您不需要计数器变量,请查看here以便更好地理解。


为什么我认为你的陈述是错误的/不是你想要的,我的回答不值得否定投票:)

此语句将回显文件extractips.txt

中的第一个$ a行
head -n$a extractedips.txt | nslookup >> ip_extracted.txt

首先你有一个带有ip的文件

cat extractedips.txt
127.0.0.1
192.168.0.1
173.194.44.88

现在我们如果你做了

for a in 1 2 3
    head -n$a
done

脚本将输出

127.0.0.1
127.0.0.1
192.168.0.1
127.0.0.1
192.168.0.1
173.194.44.88

但我想你需要一个包含所有ip的列表一次。如果你不需要复制ip,你也可以删除它们。这将为您提供一个已删除重复项的已排序列表。

for a in $(sort test.txt | uniq -u)
do
echo $a | nslookup >> ip_extracted.txt
done

<强>更新

正如Aleks评论的那样,如果文本文件包含&#39; *&#39;焦炭。 shell将展开当前目录中的所有文件并回显文件名。我不知道:/