var=`sqlplus -s user/pass <<EOF
2 set feedback off
3 set heading off
4 set pagesize 2000
5 select * from orders;
6 exit
7 EOF`
8 cnt=${#var[@]}
9 for (( i=0 ; i<cnt ; i++ ))
10 do
11 echo $var[0]
12 echo $var[1]
13 done
这是我正在使用的代码,但总是给我最后一行。
结果如下:
$ sh test.sh
[0] 5 555 c52
[1] 5 555 c52
这是表格:
ORDER_ID QUANTITY EAN C_ID
--------------- ---------- ---------- --------------------
o1 14 551 c1
o2 14 552 c2
o3 3 553 c3
o4 4 554 c4
o5 5 555 c5
答案 0 :(得分:2)
变量var
不是数组。它的简单标量变量包含多行文本。因此,您不能使用它来循环来检索变量内容。尝试这样的事情:
~$ var=$(sqlplus -s user/pass@db_tnsalias <<EOF
set feedback off
set heading off
set pagesize 0
select * from orders;
exit
EOF
)
~$ echo "$var" | while read line; do echo $line; done
o1 14 551 c1
o2 4 552 c2
o3 3 553 c3
o4 4 554 c4
o5 5 555 c5
注意:
$var
引用双引号以避免变量扩展pegesize 0
删除第一个空行答案 1 :(得分:0)
这不起作用,因为sql命令返回的行然后逐字输入数组。所以之后没有任何迹象表明数据行结束而下一行开始。我没有填充一个数组,而是将整个输出传输到一个while循环中,该循环从stdin读取,如下所示:
{ sqlplus -s system/subho94 <<EOF
set feedback off
set heading off
set pagesize 2000
select * from orders;
exit
EOF
} |
while read orderid quantity ean cid; do
echo $orderid $quantity $ean $cid
done
请注意,在从stdin读取行时,shell会对行进行标记,但会应用IFS,这会导致从列中删除所有空白区域,但我认为这正是您想要的。