关于Shell中 echo变量 的打印结果为 More... 变量值的解决方法

 

最近写了一个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

你可能感兴趣的:(技术学习)