Shell脚本:从函数返回的计数不正确

时间:2015-10-03 12:31:46

标签: linux shell unix

在下面的shell脚本中,我连接到DB并获取计数值。 在下面的代码中,我没有得到正确的计数值。而是返回185(随机int值) 但应该返回的实际计数值是2233。 如果我将return替换为echo,则会输出正确的2233值。但是alertCount变量被赋值为0。

findAlertCount(){
(
count=$(sqlplus -s  ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID} <<END
#connect ${DBA_ORACLE_USER}/${DBA_ORACLE_PWORD}@${ORACLE_SID}
set serveroutput on
set linesize 1000
set heading off
set feedback off
SELECT count(1)
FROM mytable
WHERE mycolumn IS NOT NULL;
exit;
END
)
return "$count"
)
}

findAlertCount
alertCount=$?
echo "alertCount" $alertCount 

//如果使用return,则打印185。如果使用回声,则打印0。

2 个答案:

答案 0 :(得分:3)

使用printf并将函数中“count”的最终值检索为stdout。

#!/bin/sh


findAlertCount()
{
    count=2233
    printf "$count"
}

alertCount=$(findAlertCount)

printf "alertCount $alertCount\n"

另外,我发现你使用括号()来调用函数体作为子shell。如果意图仅仅是将命令描述为集合或列表,则可以尝试使用括号{},以便计数的其他部分可以访问count的值。

答案 1 :(得分:1)

如有疑问,请简化。并使用set -x查看正在发生的事情。在这里,我用一个简单的echo替换你的SQL命令来模拟你的SQL(因为我没有访问Oracle):

set -x
findAlertCount(){
(
    count=$(echo 2233)
    return "$count"
)
}

findAlertCount
alertCount=$?
echo "alertCount" $alertCount

运行时,打印:

+ findAlertCount
++ echo 2233
+ count=2233
+ return 2233
+ alertCount=185
+ echo alertCount 185
alertCount 185

然而,稍微改写一下:

set -x
findAlertCount(){
    count=$(echo 2233)
    echo "$count"
}

alertCount=$(findAlertCount)
echo "alertCount" $alertCount

并运行它我们得到了预期的结果:

++ findAlertCount
+++ echo 2233
++ count=2233
++ echo 2233
+ alertCount=2233
+ echo alertCount 2233
alertCount 2233