为啥退出在功能命令中不起作用如何使其工作?

Posted

技术标签:

【中文标题】为啥退出在功能命令中不起作用如何使其工作?【英文标题】:Why exit doesn't work in Function Command how to make it working?为什么退出在功能命令中不起作用如何使其工作? 【发布时间】:2020-01-13 03:29:04 【问题描述】:

使用函数命令时退出问题

我找到了这个关于出口的主题,我将重用他的例子来展示我遇到的问题:Difference between return and exit in Bash functions

有一个exit不能正常工作的情况:Function Command。谁能解释一下?

#!/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!
)
...

在主要:

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

【问题讨论】:

【参考方案1】:

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

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

如果这是您需要做的事情,您的函数可以返回一个“特殊”状态,主 shell 可以对其进行操作:

exitfunc() 
    echo "some text"
    return 234


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

【讨论】:

问题是我的返回是一个字符串,然后我不能使用返回语句。感谢您对命令替换的解释。 那么听起来那个函数做得太多了。重组,以便您拥有一个生成该字符串的函数和另一个执行清理并退出的函数。

以上是关于为啥退出在功能命令中不起作用如何使其工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥事件触发器在统一 2d 中不起作用?

为啥 HTML5 拖放功能在 Firefox 中不起作用?

为啥复制功能在 setTimeout 中不起作用?

为啥 apt-get 功能在 Mac OS X v10.9 (Mavericks) 的终端中不起作用?

为啥将命令输出定向到变量在批处理文件中不起作用

为啥php邮件功能在xampp中不起作用