在 Unix shell 脚本中设置退出代码
Posted
技术标签:
【中文标题】在 Unix shell 脚本中设置退出代码【英文标题】:Setting exit codes in Unix shell scripts 【发布时间】:2014-02-20 02:23:55 【问题描述】:我有 test.sh 它有多个返回条件和 test1.sh 只是回显语句。当我运行 test2.sh 我的逻辑应该运行 test.sh 处理文件,即“文件成功”并调用 test1.sh 脚本。它执行其他 else 条件时不应运行 test1.sh 脚本。即“文件未成功”、“目录中不存在输入文件”
我面临的问题是,当它执行“文件未成功”、“目录中不存在输入文件”等其他条件时,它没有将“1”重新调整为指定的退出代码,而是返回 0,即从操作系统意味着工作成功。因此,对于所有不同的条件,我都从 test.sh 获得“0”,因此无论文件处理是否失败等都会调用 test1 .sh。请提供返回码的建议
test.sh
FILES=/export/home/input.txt
cat $FILES | nawk -F '|' 'print $1 "|" $2 "|" ' $f > output.unl
if [[ -f $FILES ]];
then if [[ $? -eq 0 ]]; then
echo "File successfully"
else
echo "File not successfully"
exit 1
fi
else
echo "Input file doesn't exists in directory" exit 1 fi
================================================ ==========================
test1.sh
echo "Input file exists in directory"
test2.sh
echo "In test2 script"
./test.sh
echo "return code" $?
if [[ $? -eq 0 ]]; then
echo "inside"
./test1.sh
fi
【问题讨论】:
test.sh
的格式似乎不正确(见最后一行)。另外,$FILES
是如何初始化的?此外,在test.sh
中测试$?
似乎没有必要,因为您已经在使用-f
测试$FILES
的存在。
您的 test.sh
在语法上无效 - nawk
程序缺少单引号,并且最后一行将不起作用,除非您至少将 fi
放在单独的行上。如果您确实有 exit 1
与您的 echo
语句在同一行,那么它只会成为另一个输出字符串,这将解释为什么未设置退出代码。
当您避免显式测试$?
时,此类问题通常会消失。无需测试$?
,只需检查实际调用。也就是说,写if ./test.sh; then echo inside; ...; fi
您显示的示例代码显然不是您的实际代码(您真的“回显 ... exit 1 fi”吗?它使 if
未关闭,只是回显 exit 1
而不是执行exit
?),所以任何答案都纯属推测,但我认为您的 exit
可能是从子外壳中调用的。
【参考方案1】:
当您在 echo 中使用 $?
时,您将覆盖它 - 之后,它包含 echo 本身的退出代码。将其存储在变量中以避免这种情况。
echo "In test2 script"
./test.sh
testresult=$?
echo "return code" $testresult
if [[ $testresult -eq 0 ]]; then
echo "inside"
./test1.sh
fi
编辑添加:很难从 test.sh 中说出您想要什么,因为您粘贴的代码不完整,甚至无法运行。 看起来你的意思是 cat
在 if
内,否则当输入文件丢失时它会出错,而你的 $?
测试什么也不做。所以我把它重新排列成这样:
FILES=input.txt
if [[ -f $FILES ]]; then
cat $FILES | awk -F '|' '/bad/ exit 1 '
if [[ $? -eq 0 ]]; then
echo "File processed successfully"
else
echo "File processing failed"
exit 1
fi
else
echo "Input file doesn't exist in directory"
exit 1
fi
我已经更改了 awk 脚本来演示条件都可以工作:现在,如果我在 input.txt 中输入单词 bad
,您将看到“文件处理失败”消息,否则您会看到成功;删除文件,您会看到输入文件不存在消息。
【讨论】:
我尝试了该选项,但没有成功。对于所有其他条件,它仍然返回“0” 我想你的意思是 test.sh 中的 else 条件。我也更新了解决该问题的答案,但很难说你在那里尝试做什么。 @hi All -我已经更新了脚本以了解我在做什么,但这没有多大意义。如果 cat 命令成功,它将一直返回“0”。我的询问它是否会进入任何 else 块,为什么它仍在重新调整“0”。 您的最新更新仍然没有意义。现在有一个从未设置过的变量 $f,由于缺少换行符导致的语法错误,您的代码甚至还没有运行。但是,如果我在明显的位置插入换行符,您的代码 不会 从 else 块返回 0,它会返回 1。test2.sh 中的代码仍然是错误的(如我所说),或者还有更多您没有发布的代码也是错误的。 @bazzargh-你没有得到上下文。我是说在所有 else 块中仍然返回“O”以上是关于在 Unix shell 脚本中设置退出代码的主要内容,如果未能解决你的问题,请参考以下文章
运行 python 脚本运行 shell 文件时退出代码 191