2014-10-03 57 views
0

我的脚本部分工作,或者直到我想能够运行一个while循环,只要IP变量中有IP,我已经搜索了一段时间在谷歌壳循环,但我不能完全弄清楚如何写它,所以我可以只添加几个IP的并运行它。写一段时间几个ip运行shell脚本

我从丹麦来的,所以变量可以看起来很奇怪的^^

#!/bin/bash 
# snmp printer status 
#Function takes two arguments: ip oid 
#function snmpget() 
#{ 
# snmpdata=`snmpget -v2c -c public $1 $2 | cut -d" " -f3-` 
# echo $snmpdata 
#} 
     kunde='fkt' 
     ip[0]= '172.29.8.250' 
     ip[1]= '172.29.8.200' 
let a=0 
while [[ $a -lt ${#ip[*]} ]] ; do 
let a+=1 
serienummer=$(snmpget -v2c -c public $ip iso.3.6.1.2.1.43.5.1.1.17.1 | cut -d" " -f4-) 
model=$(snmpget -v2c -c public $ip iso.3.6.1.2.1.43.5.1.1.16.1 | cut -d" " -f4-) 
ialt=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.43.10.1.1.12.1.1 | cut -d" " -f4-) 
a3f=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.42.2.1.1.1.8.1.1 | cut -d" " -f4-) 
a3sh=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.42.2.1.1.1.7.1.1 | cut -d" " -f4-) 
a4sh=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.42.2.1.1.1.7.1.3 | cut -d" " -f4-) 
a4f=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.42.2.1.1.1.8.1.3 | cut -d" " -f4-) 
hostnavn=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.40.10.1.1.5.1 | cut -d" " -f4-) 
scan=$(snmpget -v2c -c public $ip iso.3.6.1.4.1.1347.46.10.1.1.5.3 | cut -d" " -f4-) 
mysql --host=localhost --user=username --password=password status_printer -e "INSERT INTO status (serienummer,model,ialt,a3f,a3sh,a4sh,a4f,hostnavn,scan) 
VALUES('${serienummer}','${model}','${ialt}','${a3f}','${a3sh}','${a4sh}','${a4f}','${hostnavn}','${scan}');" 
done 
+0

我会认为'对于ip $ {ips [@]};做'确实是你所需要的,并发症少?你同意吗?请注意,我调用数组'ips'和单个地址'ip',但这只是一个例子 – fvu 2014-10-03 12:52:15

回答

0

格伦很好的解释为什么你的脚本失败,这里就是我想要写的方式,因为for循环是一种更自然适合我在这种情况下。我也展示了如何摆脱必须手动管理索引

# "classic" initialization 
ips[0]= '172.29.8.250' 
ips[1]= '172.29.8.200' 
# or alternatively - no need to manage the index 
ips=('172.29.8.250' '172.29.8.200') 
# or even 
ips=() 
ips+=('172.29.8.250') 
ips+=('172.29.8.200') 

for ip in ${ips[@]} ; do 
    serienummer=$(snmpget -v2c -c public $ip iso.3.6.1.2.1.43.5.1.1.17.1 | cut -d" " -f4-) 
    # and so on 
done 
1

你有

ip[0]= '172.29.8.250' 
ip[1]= '172.29.8.200' 
let a=0 
while [[ $a -lt ${#ip[*]} ]] ; do 
    let a+=1 
    serienummer=$(snmpget -v2c -c public $ip iso.3.6.1.2.1.43.5.1.1.17.1   | cut -d" " -f4-) 
    # ....................................^^ 

你循环索引变量,但你不使用它。你可以改变$ip${ip[a]},或使用FVU的建议下做的下降的while回路,并使用for(这是我做什么)

请注意,如果您使用的数组变量不指定索引,它似乎给你的第一个元素:

$ ip=(one two three) 
$ echo ${ip[1]} 
two 
$ echo $ip 
one 

$ echo ${#ip[*]} 
3 
$ let a=0 
$ while [[ $a -lt ${#ip[*]} ]]; do 
> echo $ip 
> let a+=1 
> done 
one 
one 
one 
+0

真棒!它的工作:D 现在我有这个问题,当打印机没有回答,脚本课程给我一个超时,但我怎么能忽略“缺​​少”打印机答案,并继续到下一个IP行? Kim – KimSondergaard 2014-10-10 09:50:11

+0

提出新的问题 – 2014-10-10 15:24:05