Bash脚本未检测到失败的退出代码

时间:2016-05-11 02:12:08

标签: linux bash shell scripting

我无法获取我的bash脚本(日志记录文件)来检测除0之外的任何其他退出代码,因此失败命令的计数不会增加,但无论是否成功,成功都会增加命令失败或成功。

以下是代码:

#!/bin/bash
#Script for Homework 8
#Created by Greg Kendall on 5/10/2016
file=$$.cmd
signal() {
    rm -f $file
    echo
    echo "User Aborted by Control-C"
    exit
}
trap signal 2
i=0
success=0
fail=0
commands=0
read  -p "$(pwd)$" "command"
while [ "$command" != 'exit' ]
do
    $command
    ((i++))
    echo $i: "$command" >> $file
    if [ "$?" -eq 0 ]
        then
            ((success++))
            ((commands++))
        else
            ((fail++))
            ((commands++))
    fi
    read -p "$(pwd)" "command"
done
if [ "$command" == 'exit' ]
    then
    rm -f $file
    echo commands:$commands "(successes:$success, failures:$fail)"
fi

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

这是因为echo $i: "$command"总是在成功。

$?中的退出状态if [ "$?" -eq 0 ]实际上是echo的退出状态,该命令在检查之前立即运行。

在命令之后立即进行测试:

$command
if [ "$?" -eq 0 ]

并在其他地方使用echo

如果您愿意,根本不需要进行$?检查,您可以单独if内运行命令并检查状态:

if $command; then .....; else ....; fi

如果您不想获得STDOUT和STDERR:

if $command &>/dev/null; then .....; else ....; fi

**请注意,评论@Charles Duffy mentionedyou should not run command(s) from variables

答案 1 :(得分:0)

您的代码正确计算echo $i: "$command"命令失败的次数。我认为您更愿意计算$command失败的次数。在这种情况下,请替换:

$command
((i++))
echo $i: "$command" >> $file
if [ "$?" -eq 0 ]

使用:

$command
code=$?
((i++))
echo $i: "$command" >> $file
if [ "$code" -eq 0 ]

由于$?捕获了上一个命令的退出代码,因此它应该紧跟在我们想要捕获其代码的命令之后。

改进

为了确保在运行任何其他命令之前捕获$?的值,Charles Duffy建议将赋值放在与命令相同的行上,如下所示:

$command; code=$?
((i++))
echo $i: "$command" >> $file
if [ "$code" -eq 0 ]

这应该使得将来对代码的任何更改都不太可能将命令与捕获$?的值分开。