У меня нет вашей базы данных, поэтому я поместил ваш запрос в файл с именем output.txt
, и это, кажется, работает:
#!/bin/bash
declare -a my_array=( $(cat output.txt) )
for ((i=3; i < ${#my_array[@]}; i+=3)); do
RCRD_ID=${my_array[i]}
ACCOUNT=${my_array[i+2]}
printf "<RCRD_ID>%s</RCRD_ID>\n<ACCOUNT>%s</ACCOUNT>\n" "$RCRD_ID" "$ACCOUNT"
done
Вывод:
<RCRD_ID>630566DAD135E9A11</RCRD_ID>
<ACCOUNT>JZZ35</ACCOUNT>
<RCRD_ID>630566DAD135E9A12</RCRD_ID>
<ACCOUNT>EGC46</ACCOUNT>
<RCRD_ID>630566DAD135E9A13</RCRD_ID>
<ACCOUNT>85955</ACCOUNT>
<RCRD_ID>630566DAD135E9A14</RCRD_ID>
<ACCOUNT>EGC36</ACCOUNT>
<RCRD_ID>630566DAD135E9A15</RCRD_ID>
<ACCOUNT>85044</ACCOUNT>
<RCRD_ID>630566DAD135E9A16</RCRD_ID>
<ACCOUNT>JZZ53</ACCOUNT>
<RCRD_ID>630566DAD135E9A17</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>
<RCRD_ID>630566DAD135E9A18</RCRD_ID>
<ACCOUNT>85044</ACCOUNT>
<RCRD_ID>630566DAD135E9A19</RCRD_ID>
<ACCOUNT>JZZ53</ACCOUNT>
<RCRD_ID>630566DAD135E9A110</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>
<RCRD_ID>630566DAD135E9A111</RCRD_ID>
<ACCOUNT>09686</ACCOUNT>
Что вы пропустили:
Во-первых, declare -a my_array =
не является синтаксисом присваивания оболочки - знак =
не должен содержать окружающих пробелов.
Во-вторых, синтаксис массива равен array=( ... )
, где часть ...
будет выводом вашей команды оболочки, а именно $(sqlplus ...)
.
Если вы настаиваете на использовании синтаксиса << eof
, то вы можете сделать что-то вроде:
declare -a my_array=( $(sqlplus -s "$SqlString" << eof
set trimout on feedback off verify off heading off echo off;
SELECT RCRD_ID FROM ACCNT_DTLS WHERE EVNT_ID='$Event' ORDER BY LPAD(RCRD_ID, (SELECT MAX(LENGTH(RCRD_ID)) FROM ACCNT_DTLS)) ASC;
EXIT;
eof
В-третьих, выходные данные будут представлять собой просто набор разделенных пробелами токенов, и для вашего вывода каждые 3 токена вместе представляют собой интересную единицу работы, поэтому часть i+=3
. Циклы отображаются на i=3
, потому что первая строка - первые 3 токена - не то, что вы хотите в выводе.