为什么退出在Function Command中不起作用,如何使其起作用?

时间:2019-09-11 09:56:48

标签: shell

使用功能命令时出现退出问题

我找到了有关出口的主题,我将重用他的示例来说明我的问题:Difference between return and exit in Bash functions

在某些情况下,出口不能正常工作:功能命令。有人可以解释吗?

#!/bin/sh

retfunc()
{
    echo "this is retfunc()"
    return 1
}

exitfunc()
{
    echo "this is exitfunc()"
    exit 1
}

retfunc
RETFUNC_RETURN_CODE=$?
echo "We are still here"
echo "return code : $RETFUNC_RETURN_CODE"
TEXT=$(exitfunc)
echo $TEXT
echo "We will see this however the exit !!!!! => you need to use global variable to return Strings"
exitfunc
echo "We will never see this"

在我的实际情况下,我使用一个函数来调用sqlplus命令,如果发生错误,我想退出,但是我想从该函数返回结果字符串(我无法通过使用return语句来完成此操作)因为它是一个字符串而不是数字)

我的解决方案是使用全局变量,但它将行数相乘。有人对我有其他解决方案吗?

#!/bin/sh

#****************ORACLE CALL FUNCTION****************
function run_oracle {
## need two arguments connextion string as first argument and sql_stmt as second
local CONNEXION=$1
local STMT=$2
##
RETSTRING=$(sqlplus -s ${CONNEXION} as sysdba <<EOF!
set serveroutput off heading off feedback off verify off define off linesize 2000
${STMT};
exit
EOF!
)
check_ora_error "$RETSTRING" $CONNEXION
}
#***********ORACLE CALL FUNCTION ENDS****************

#************Check ORA ERROR FUNCTION****************
function check_ora_error {
if [[ $1 = *"ORA-12514"* ]];then
    echo 
    echo "Sqlplus make an ORA- ERROR"
    echo "$1"
    echo
    echo "Connexion string $2 is wrong"
    echo
    echo "EXIT"
    exit 1
fi
}
#************Check ORA ERROR FUNCTION ENDS***********

SQL_STMT="select USERNAME,default_tablespace,account_status from DBA_USERS where username='${USER_TO_COMPARE}'"

run_oracle ${CONNEXION_STRING_ORIG} "${SQL_STMT}"
USER_ORIG=${RETSTRING}

我想减少代码:

在功能中:

...
$(sqlplus -s ${CONNEXION} as sysdba <<EOF!
set serveroutput off heading off feedback off verify off define off linesize 2000
${STMT};
exit
EOF!
)
...

在Main中:

USER_ORIG=$(run_oracle ${CONNEXION_STRING_ORIG} "${SQL_STMT}")

1 个答案:

答案 0 :(得分:0)

命令替换在子shell中执行:当您在命令替换中退出时,仅退出子shell。

我不明白您为什么要捕获exitfunc函数的输出。 您不必捕获函数的输出并回显它:如果不捕获函数,则在函数内部回显的文本将显示在stdout上。

如果这是您需要要做的事情,则您的函数可以返回主外壳程序可以执行的“特殊”状态:

exitfunc() {
    echo "some text"
    return 234
}

text=$(exitfunc)
status=$?
(( status == 234 )) && exit