今天編寫一個AIX上的KSH腳本,功能是定期收集VMSTAT信息並且放入ORACLE數據庫,以供查詢分析,腳本如下:
#!/usr/bin/ksh
export ORACLE_HOME=/home/oracle/database
export PATH=$ORACLE_HOME/bin:$PATH
SERVER_NAME=`uname -a|awk '{print $2}'
typeset -u SERVER_NAME
export SERVER_NAME
SAMPLE_TIME=300
while true
do
vmstat ${SAMPLE_TIME} 2 > /tmp/msg$$
cat /tmp/msg$$|sed 1,3d| awk '{ printf("%s %s %s %s %s %s %s\n", $1, $6, $7, $14 ,$15, $16, $17) }'
while read RUNQUE PAGE_IN PAGE_OUT USER_CPU SYSTEM_CPU IDLE_CPU WAIT_CPU
do
$ORACLE_HOME/bin/sqlplus -s test/test@sid<<EOF
insert into test.test$vmstat values (
sysdate,
$SAMPLE_TIME,
'$SERVER_NAME',
$RUNQUE,
$PAGE_IN,
$PAGE_OUT,
$USER_CPU,
$SYSTEM_CPU,
$IDLE_CPU,
0
);
EXIT
EOF
done
done
rm /tmp/msg$$
結果悲劇就發生在上面最後一個“EOF”上,為了代碼格式,我把EOF前面也加了TAB,但是這卻是EOF所不允許的,出現了如下錯誤:
./get_vmstat.sh[13]: 0403-057 Syntax error at line 20 : `<' is not matched
EOF是代表Here Documents的結束。注意此處不能像寫C程序一樣,為了美觀而把EOF向右縮進,因為SHELL規定EOF必須是該行唯一出現的內容,連空格都不能有。因此,這個EOF就暫時突出在這一行了。(通過將輸入操作符改為“<<-”可以解決這個問題,但是這裡也無傷大雅)。