我无法获取我的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
非常感谢任何帮助。谢谢!
答案 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 mentioned为you 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 ]
这应该使得将来对代码的任何更改都不太可能将命令与捕获$?
的值分开。