【发布时间】:2020-11-07 03:23:49
【问题描述】:
我有 2 个脚本。我正在调用另一个脚本来捕获退出状态。
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'`
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 $?
temp.sh
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 =
内部脚本以 exit 1 退出(因为 cat 命令失败),但在 temp.sh 中,我在捕获返回码时没有获得预期值。
我想确保无论哪个命令在 import.sh 中失败,脚本都应该以适当的退出状态返回。
【问题讨论】:
-
@oguzismail 提供了所需的一切。你能告诉我你还需要什么吗? ?
-
@oguzismail 我已更正,提供了 schema_remap_AANV02_UAT2.txt 文件的内容。 Import.sh 脚本仅使用此 txt 文件。
-
顺便说一下,请参阅 DontReadLinesWithFor 和 BashFAQ #1 了解编写循环的更有效方法。
-
并且不要为您自己的变量使用全大写的名称——它们用于对您不应该覆盖的系统有意义的变量。为避免破坏其他期望像
$USER这样的内置变量具有其原始、有意义的值的程序,请在您自己定义时使用小写的$user。这也是 POSIX 标准推荐的内容:请参阅 pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,在阅读时请记住,设置 shell 变量会覆盖任何预先存在的同名环境变量。 -
@alecxs, ...好吧,总是在回显成功时:)——但现在,他们甚至没有尝试到
exit $RC,所以使用@ 987654331@而不是...command...; rc=$?是现有代码主动出错的地方。