Linux 执行脚本后获取的退出状态不正确
我有两个脚本。我从另一个脚本调用一个脚本来捕获退出状态 Import.shLinux 执行脚本后获取的退出状态不正确,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有两个脚本。我从另一个脚本调用一个脚本来捕获退出状态 Import.sh SCHEMA=$1 DBNAME=$2 LOGPATH=/app/dbimport/PreImport_`date +%d%b%Y`.log export ORACLE_HOME=/oracle/product/11.2.0/db set -x for line in `cat "$SCHEMA" | egrep -w 'PANV|PANVPXE'`
SCHEMA=$1
DBNAME=$2
LOGPATH=/app/dbimport/PreImport_`date +%d%b%Y`.log
export ORACLE_HOME=/oracle/product/11.2.0/db
set -x
for line in `cat "$SCHEMA" | egrep -w 'PANV|PANVPXE'`
do
USER=`echo "$line" |cut -d ';' -f1`
echo "Fetching User : $USER" >> "$LOGPATH"
PASSWORD=`echo "$line" | cut -d ';' -f2`
echo "Fetching Password: $PASSWORD" >> "$LOGPATH"
SOURCE=`echo "$line" | cut -d ';' -f3`
echo "Fetching Source Schema : $SOURCE" >> "$LOGPATH"
done
exit $?
临时秘书
RC=`/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA`
echo "Return code = $RC"
schema_remap_AANV02_UAT2.txt
AANVPXE;Arju4578;PANVPXE
AANVSL;Arj0098;PANVSL
AANV;Arju1345;PANV
.txt文件没有读取权限请确保您没有授予读取权限,因此脚本应通过将退出状态返回为exit$?而失败
下面是我运行temp.sh后的输出
+ cat schema_remap_AANV02_UAT2.txt
+ egrep -w 'PANV|PANVPXE'
cat: schema_remap_AANV02_UAT2.txt: Permission denied
+ exit 1
Return code =
内部脚本正在退出,退出1因为cat命令失败,但在temp.sh内部,在捕获返回代码时,我没有获得预期值
我想确保无论哪个命令在import.sh中失败,脚本都应该返回相应的退出状态。要获取脚本import.sh的退出代码而不是其输出,请将脚本temp.sh更改为 或者干脆
/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA
echo "Return code = $?"
有关如何修复/改进脚本的提示,请参见注释。我试图了解如何将子脚本导入父脚本temp.sh。让我告诉你发生了什么 导入脚本 当grep出现问题时,该脚本将以不同于0的方式退出,因此如果您正在寻找的模式不存在,它将失败
$ echo "hello" | egrep -i "bye"
$ echo $?
1
然后从其他程序运行此脚本
发射装置
这就是问题所在。您正在像调用函数一样调用脚本,并期望得到结果。变量RC获取脚本发送到标准输出的任何输出,而不是其他输出。RC将始终为空,因为您的脚本不会向标准输出发送任何内容。因此,您必须理解从子程序获取结果和计算生成子程序的返回代码之间的区别
让我给你看一个我刚才用我自己的脚本向你解释的例子。我有两个脚本:child.sh只是Oracle的sqlplus。父对象以与您相同的方式调用子对象
$ more child.sh
#/bin/bash
$ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << eof
whenever sqlerror exit failure;
select * from dual ;
eof
if [[ $? -eq 0 ]];
then
exit 0;
else
exit 99;
fi
$ more parent.sh
#!/bin/bash
# run child
var=`/orabatch/ftpcpl/log/child.sh`
echo $var
$ ./child.sh
D
-
X
$ echo $?
0
$ ./parent.sh
D - X
$ echo $?
0
如您所见,我的操作的输出是第一个操作中的错误,但不是错误,而是输出。我的父母已经结束了,好的,即使你可以看到有一个错误
我将重写脚本如下:
#/bin/bash
my_path=/app/arjun/scripts
$my_path/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA
result=$?
if [ ${result} -ne 0 ];
then
echo "error"
exit 2;
fi
@oguzismail提供了所需的一切。你能告诉我你还需要什么吗@我已更正的oguzismail提供了schema_remap_AANV02_UAT2.txt文件的内容。Import.sh脚本仅使用此txt文件。顺便说一下,有关编写循环的更有效方法,请参阅和。不要对自己的变量使用所有大写名称-它们用于对系统有意义且不应覆盖的变量。为了避免破坏其他希望$USER等内置变量具有原始有意义值的程序,请在自己定义时使用小写$USER。这也是POSIX标准的建议:请参阅,阅读时请记住,设置shell变量会覆盖任何先前存在的命名环境变量。@alecxs。。。好的,总是在echo成功时:-但是现在,他们甚至没有尝试退出$RC,所以使用RC=$…命令。。。而不是…命令。。。;rc=$?是现有代码严重错误的地方。
RC=`/app/arjun/scripts/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA`
echo "Return code = $RC"
$ more child.sh
#/bin/bash
$ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << eof
whenever sqlerror exit failure;
select * from dual ;
eof
if [[ $? -eq 0 ]];
then
exit 0;
else
exit 99;
fi
$ more parent.sh
#!/bin/bash
# run child
var=`/orabatch/ftpcpl/log/child.sh`
echo $var
$ ./child.sh
D
-
X
$ echo $?
0
$ ./parent.sh
D - X
$ echo $?
0
$ ./child.sh
select * from dual0
*
ERROR at line 1:
ORA-00942: table or view does not exist
$ ./parent.sh
ERROR at line 1:
ORA-00942: table or view does not exist
$ echo $?
0
#/bin/bash
my_path=/app/arjun/scripts
$my_path/Import.sh schema_remap_AANV02_UAT2.txt ARJSCHEMA
result=$?
if [ ${result} -ne 0 ];
then
echo "error"
exit 2;
fi