使用功能命令时出现退出问题
我找到了有关出口的主题,我将重用他的示例来说明我的问题: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}")
答案 0 :(得分:0)
命令替换在子shell中执行:当您在命令替换中退出时,仅退出子shell。
我不明白您为什么要捕获exitfunc
函数的输出。
您不必捕获函数的输出并回显它:如果不捕获函数,则在函数内部回显的文本将显示在stdout上。
如果这是您需要要做的事情,则您的函数可以返回主外壳程序可以执行的“特殊”状态:
exitfunc() {
echo "some text"
return 234
}
text=$(exitfunc)
status=$?
(( status == 234 )) && exit