最近有点迷恋shell了。呵呵,不过我也只是皮毛,就把我的所知写在这里吧。
附上晶晶小妹的一段shell,慢慢品位吧~~
0 #!/bin/bash
1 # 脚本名:mystat 用途:收集vmstat 资料到my_os_stat 表中
2 # 命令格式: ./mystat 间隔时间 次数
3 # 省略次数,将会无限制运行。 省略间隔时间,将使用缺省时间300 秒(即5 分钟)
4 i=1
5 k="$1"
6 j="$2"
7 if [ -z "$1" ]
8 then
9 k=300
10 fi
11 if [ -z "$2" ]
12 then
13 j=2
14 fi
15 while (( i <= j ))
16 do
17 vmstat $k 2|sed 1,3d|tr -s " "|{
18 read a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16;
19 sqlplus scott/password << EOF
20 insert into my_os_stat values(sysdate,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,
21 $a10,$a11,$a12,$a13,$a14,$a15,$a16);
22 commit;
23 exit
24 EOF
25 # 注意,在上面的循环内,EOF 前不可以有空格。
26 }
27 if [ -n "$2" ]
28 then
29 let i=i+1
30 fi
31 done
我在研究此段代码的时候,对if 里的-z和-n,困惑了很久,经过不懈努力终于解开谜团。
第7和11行,-z是判断是否为空值,如果为空,执行then
第27行,-n是判断是否有值,如果有值,执行then
虽然-z和-n意思相近,不过很容易混淆,我就在这栽了跟头。
注意:
1. "|"代表"管道",即不将vmstat 的结果发送的屏幕上,而是传递给后面的命令处理。
2. sed 1,3d 的作用,是将vmstat 传递过来的结果进行处理,删除1 至3 行。d 的意思是删除,1,3 是删除1 至3 行。
3. 接下来,结果会被通过管道,传递给tr -s " "命令,这个命令的作用是将重复的空格压缩为1 个
4. 接下来,结果将会以管道的形式,传递给下一个命令。下一命令是用{ }括起来的命令组合。read a1 a2 ...。a16,它从管道的前一个命令的输出结果中,以空格为间隔,依次读出每一个数字,按顺序分别赋给a1,a2 等变量。当read 从管道的一端读出数据到变量中后,各个变量的值无法在下一命令中使用。因此,需要用一对括号{},将read 和后面的命令组合起来,这样后面的命令就可以使用read 中的变量了。因此,我们可以暂时的将大括号中的所有命令,理解为一个整体。需要
注意的是大括号中的各命令,用“;”号间隔。
5. <
6. “$1”,“$2”它们两个,分别代表第一与第二个命令行参数。
以上6点,需要注意。同时此段脚本的作用应该已经很明了了,是按照vmstat中输入的参数将内容处理后插入到my_os_stat中.如果vmstat参数没有输入或输入不全,此段脚本将陷入死循环,将持续不断的将vmstat信息插入到my_os_stat中。
好了,以上代码解析完了,留此纪念,供日后参考。
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9533994/viewspace-1006093/ ,如需转载,请注明出处,否则将追究法律责任。