【问题标题】:Writing a while for several ip running shell script写了一段时间为几个ip运行shell脚本
【发布时间】:2014-10-03 12:44:10
【问题描述】:

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

我来自丹麦,所以变量看起来很奇怪^^

#!/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

【问题讨论】:

  • 我认为for ip in ${ips[@]} ; do 完全符合您的需求,而且复杂性更小?你同意吗?请注意,我将数组称为ips,将单个地址称为ip,但这只是一个示例

标签: mysql shell ip sh snmp


【解决方案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

【讨论】:

  • 太棒了!它起作用了:D 现在我遇到了问题,当打印机没有应答时,脚本当然会给我一个超时,但是我怎样才能忽略“丢失”的打印机应答,并继续到下一个 IP 行呢?金
【解决方案2】:

Glenn 很好地解释了您的脚本失败的原因,这是我编写它的方式,因为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多