最近在进行网络设备监控数据抓取,为了方便进行数据收集,抽时间简单的学习了脚本编写。
1. 函数定义
脚本中以function 定义函数,同Javascript 中一样,不同的时,脚本默认可以不写function. 常见的脚本函数定义:
方式一
function getA(){
echo 'hello'
}
方式二
getB(){
echo 'world'
}
2. 调用关系
脚本函数一定要声明在调用前,必须先声明函数,才可以调用,顺序执行。如果先调用后声明会报错,找不到函数。不同于JavaScript 。
正确的方式,注意函数调用时,直接用函数名即可,不需要添加().
声明函数
function getHello(){
echo 'hello world'
}
getHello
3 参数传递
脚本函数参数不是声明在函数里,不同JavaScript 和Java 等语言,参数写在行数括号内,脚本函数的方法不写参数。参数是从输入代入。参数通过 $n 进行获取
function test(){
echo $1;
}
test 124
4 变量赋值
变量赋值时,左右两端不能有空格,负责会将空格解析。
正确示例
a=124
错误示例
a = 124
a= 124
a =124
5 条件判断
条件判断时,特别是if 判断字符串相等时,要注意空串。
当$a 不为空时,此判断执行没有问题,当$a 为空时,会报错。原因是当$a 为空时,
此判断条件变为了 == 'a' 故报错。
if [ $a == 'a' ];then
echo 'yes'
else
echo 'no'
fi
正确写入如下:
多加一个[]进行空判断
if [[ $a == 'a' ]];then
echo 'yes'
else
echo 'no'
fi
或 添加一个连接值,保证不为空,进行判断
if [[ "$a"x == "a"x ]];then
echo 'yes'
else
echo 'no'
fi
6 数组处理
通过()进行数组定义赋值。值用空格隔开
test=(1 2 3 4 5 6)
输出
echo ${test[@]}
长度
${#test[*]} 或 $(#test[@]])
循环输出
for i in ${test[*]}
do
echo $i
done
或
for ((i=0;i<${#test[*]};i=$i+1))
do
echo ${test[$i]}
done
7 样例数据抓取脚本
#!/bin/bash
function getNet(){
date;
echo "start snmpwalk "$1" data is running"
snmpwalk -v 2c -On -c public -t 600 $1 > $1"_public_oid.txt";
snmpwalk -v 2c -c public -t 600 $1 >$1"_public_name.txt";
snmpwalk -v 2c -On -c public -t 600 $1 1.3.6.1.4.1 >$1"_private_oid.txt";
snmpwalk -v 2c -c public -t 600 $1 1.3.6.1.4.1 >$1"_private_name.txt";
date;
echo "end snmpwalk "$1" data is finished"
}
function call(){
for line in $(cat $1)
do
echo "get current "$line
flag=`snmpwalk -v 2c -c public -t 2 $line 1.3.6.1.2.1.1.1 |grep SNMPv2-MIB|awk -F ':' '{print $1}'`
if [[ $flag == 'SNMPv2-MIB' ]];then
getNet $line
else
echo $line' snmpwalk is fail'
fi
done
}
if [ ! -n "$1" ] ;then
echo "脚本后面必须参加ip参数文件"
else
echo "开始执行脚本"
call $1
fi