以下是代码:
totLines=$(wc -l < extractedips.txt)
for((a=0;a!=$totLines;a++))
{
head -n$a extractedips.txt | nslookup >> ip_extracted.txt
}
我不确定我做错了什么。
答案 0 :(得分:4)
是的!尽管人们在说什么,但这是一个有效的bash for
循环!
但请注意,它是bash扩展名。它不是有效的sh
for循环。你不能在这种形式的循环中使用这种形式。使用#!/bin/sh
声明的shell脚本或使用sh yourscript
运行的shell脚本。
不起作用的是你的for循环内容。
head -n 42
获得前42行,而不是第42行。head
是基于1的。对您的问题的最短修复是:
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)
您应该使用do
和done
代替花括号。
像这样:
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将展开当前目录中的所有文件并回显文件名。我不知道:/