今天編寫一個AIX上的KSH腳本,功能是按期收集VMSTAT信息而且放入ORACLE數據庫,以供查詢分析,腳本以下:sql
#!/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就暫時突出在這一行了。(經過將輸入操做符改成「<<-」能夠解決這個問題,可是這裏也無傷大雅)。