最近写了一个Shell脚本给客户,被分别放在了3台不同系统的机器上:
1.HP-UX fhn089 B.11.31 U ia64 1231874750 unlimited-user license
2. SunOS fsn028 5.10 Generic_118833-36 sun4u sparc SUNW,Sun-Fire-V240
3. AIX fsn043 3 4 000930754C00
在1和2两台机器运行该脚本正常,放在3机器上,发现一种情况echo出来的数据跟真实数据有出入。
allvalue=`sqlplus -s ${userlogin} << EOF
SET LINESIZE 2000
SET HEADING OFF
SET VERIFY OFF
SET FEEDBACK OFF
alter session set nls_date_language='american';
SELECT first.prom_value_old||'|'||last.prom_value_new
FROM promot_media_channel first,
promot_media_channel last,
( SELECT prom_code AS code,
MIN(prom_upd_date) AS min_date,
MAX(prom_upd_date) AS max_date
FROM promot_media_channel
WHERE prom_cust_id = '$PMCI_CUST_ID'
AND prom_upd_date >= to_date('$PMCI_DATE','dd-mon-yy')
AND prom_upd_date < to_date('$PMCI_DATE','dd-mon-yy') + 1
AND prom_code = 'RE'
GROUP BY prom_code
)
WHERE first.prom_cust_id = '$PMCI_CUST_ID'
AND first.prom_upd_date = min_date
AND first.prom_code = code
AND last.prom_cust_id = '$PMCI_CUST_ID'
AND last.prom_upd_date = max_date
AND last.prom_code = code;
quit;
EOF`
echo $allvalue
运行结果会显示为:More ... allValue的值。
比正常的值多出一个"More ... "
而直接调用package的则不会有这个问题。
EMAIL_ADDRESS=`sqlplus -s ${userlogin} << EOF
SET LINESIZE 2000
SET HEADING OFF
SET VERIFY OFF
SET SERVEROUTPUT ON
DECLARE
stat NUMBER;
msg VARCHAR2(60);
info VARCHAR2(500);
cust_id VARCHAR2(8) := '$PMCI_CUST_ID';
BEGIN
MCS36K.get_1_info_new('0V',cust_id,stat,msg,info);
dbms_output.put_line('info: '||info);
END;
/
quit;
EOF`
echo $EMAIL_ADDRESS
修改了半天,最后发现把查询SQL语句前的Set 语句
SET LINESIZE 2000
SET HEADING OFF
SET VERIFY OFF
SET FEEDBACK OFF
换成
set pause off
set head off
set echo off
即可。
个人感觉是IBM的AIX系统要求的语法更加严格。比如 如上修改后,在AIX系统上正常运行,在1,2两个系统上也可以正常运行。
而HP-UX与SunOS相比,SunOS系统似乎语法要求严格于HP-UX。
比如 判断文件是否存在的语句,本来这样写
if [ -a ${changefile} ]
then
rm -f $changefile
fi
就可以。
实际上HP-UX支持这样的写法,但在SunOS和AIX上就要改为:
if [ -s ${changefile} ]
then
rm -f $changefile
fi
否则就要会报 test 语法错误。
个人感觉在语法规范要求上 AIX>>SunOS>>HP-UX. 如果有高手可以帮忙释疑,列出根本决定原因,在此表示感谢。
$echo $SHELL
/usr/bin/ksh