当包含空格时,我将列值存储到shell脚本变量中时遇到问题,因为所有结果都是在空格而不是实际列值上拆分的。
例如,这就是我现在所拥有的:
set -A SQL_RESULTS_ARRAY `sqlplus -s un/pass@database << EOF
SET ECHO OFF
SET FEED OFF
SET HEAD OFF
SET SPACE 0
SELECT EMAIL_SUBJECT, MAIL_TO FROM EMAIL_TABLE;
EOF`
echo "${SQL_RESULTS_ARRAY[0]}"
echo "${SQL_RESULTS_ARRAY[1]}"
这不起作用,因为EMAIL_SUBJECT的值是整个句子,即“消息主题测试”,所以那些回声最终打印
Message
subject
而不是
Message subject test
email1@email.com email2@email.com
基本上,我如何最终只得到数组中的两个项目(每列一个),而不是五个项目(每个单词一个)?只需一次连接即可实现这一切吗? (我不想每列开始一个新连接)
编辑:另一件事,我的另一个CLOB列是EMAIL_BODY,它基本上可以是任何文本 - 因此我宁愿没有预设分隔符,因为EMAIL_BODY可以有各种逗号,管道,新行,等...答案 0 :(得分:2)
您缺少的密钥是将shell的IFS(内部字段分隔符)设置为与查询结果相同。这是一个ksh会话:
$ results="Message subject test,email1@email.com email2@email.com"
$ set -A ary $results
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done
0. Message
1. subject
2. test,email1@email.com
3. email2@email.com
4.
$ IFS=,
$ set -A ary $results
$ for i in 0 1 2 3 4; do print "$i. ${ary[$i]}"; done
0. Message subject test
1. email1@email.com email2@email.com
2.
3.
4.
你可能想要做这样的事情:
results=`sqlplus ...`
old_IFS="$IFS"
IFS=,
set -A SQL_RESULTS_ARRAY $results
IFS="$old_IFS
print "${SQL_RESULTS_ARRAY[0]}"
print "${SQL_RESULTS_ARRAY[1]}"
答案 1 :(得分:0)
您可以尝试设置COLSEP并按其值分隔。
答案 2 :(得分:0)
尝试在select语句中使用字符串连接添加双引号。引用的数组元素允许空格(至少在bash中)。
答案 3 :(得分:0)
阅读bash的“内部字段分隔符”$ IFS
默认设置为空格,这可能会导致您的问题。