shell数组默认拿空格当分隔符,但如果元素里面包含空格怎么办呢?
% cat t3.sh
#!/usr/bin/ksh
set -A arr1 `sqlplus -s /NOLOG <<EOF
connect username/password@SID;
whenever sqlerror exit sql.sqlcode
set pagesize 0 feedback off verify off heading off echo off
SELECT col1|| ':' || col2 from t1;
exit;
EOF`
i=0
while [ $i -lt ${#arr1[*]} ]
do
echo ${arr1[$i]}
let i=$i+1
done
t1表有两条记录记录
SQL> select * from t1;
COL1 COL2
---------- ----------
1 aa
2 bb cc
但是t3.sh脚本执行结果却显示有3条记录,原因就是'bb cc'中间的空格当成了数组的分隔符。
golddev OEA#/tmp >./t3.sh
1:aa
2:bb
cc
尝试给字段加单引号、双引号、回车符、换行符都不管用。
chr(10)||col1|| ':' || col2 ||chr(10)
chr(13)||col1||':'||col2||chr(13)
'"'||||col1||':'||col2||'"'
''''||col1||':'||col2||''''
用IFS重新定义分隔符才解决了这个问题。
% cat t3.sh
#!/usr/bin/ksh
IFS="!!"
set -A arr1 `sqlplus -s /NOLOG <<EOF
connect username/password@SID;
whenever sqlerror exit sql.sqlcode
set pagesize 0 feedback off verify off heading off echo off
SELECT col1|| ':' || col2 from t1;
exit;
EOF`
i=0
while [ $i -lt ${#arr1[*]} ]
do
echo ${arr1[$i]}
let i=$i+1
done
执行结果如下
%./t3.sh
1:aa
2:bb cc
%
% cat t3.sh
#!/usr/bin/ksh
set -A arr1 `sqlplus -s /NOLOG <<EOF
connect username/password@SID;
whenever sqlerror exit sql.sqlcode
set pagesize 0 feedback off verify off heading off echo off
SELECT col1|| ':' || col2 from t1;
exit;
EOF`
i=0
while [ $i -lt ${#arr1[*]} ]
do
echo ${arr1[$i]}
let i=$i+1
done
t1表有两条记录记录
SQL> select * from t1;
COL1 COL2
---------- ----------
1 aa
2 bb cc
但是t3.sh脚本执行结果却显示有3条记录,原因就是'bb cc'中间的空格当成了数组的分隔符。
golddev OEA#/tmp >./t3.sh
1:aa
2:bb
cc
尝试给字段加单引号、双引号、回车符、换行符都不管用。
chr(10)||col1|| ':' || col2 ||chr(10)
chr(13)||col1||':'||col2||chr(13)
'"'||||col1||':'||col2||'"'
''''||col1||':'||col2||''''
用IFS重新定义分隔符才解决了这个问题。
% cat t3.sh
#!/usr/bin/ksh
IFS="!!"
set -A arr1 `sqlplus -s /NOLOG <<EOF
connect username/password@SID;
whenever sqlerror exit sql.sqlcode
set pagesize 0 feedback off verify off heading off echo off
SELECT col1|| ':' || col2 from t1;
exit;
EOF`
i=0
while [ $i -lt ${#arr1[*]} ]
do
echo ${arr1[$i]}
let i=$i+1
done
执行结果如下
%./t3.sh
1:aa
2:bb cc
%