0

我正在处理一个考试练习问题,我们需要在文件上调用一个脚本。如果退出状态不为零,我们将失败次数加一,否则我们将 sum 变量加一。由于我们实际上没有这个脚本,所以我只是想验证我在纸上写的内容是否正确,假设我们调用的脚本称为计算,并且 args 是所有文件参数。

SUM=0
NUMFAILS=0
SCRIPT=./$compute

for args in *; do
    num=$SCRIPT args
    if (($? -ne 0)); then
        NUMFAILS++
    else
        SUM=(($SUM+$num))
    fi
done
4

1 回答 1

2
sum=0
numfails=0

shopt -s nullglob

for args in *; do
    if num=$(./compute "$args"); then
       ((sum+=num))
    else
       ((numfails++)) 
    fi
done
  • 您可以$?用于测试最后一个命令的退出状态,也可以if直接使用:if command; then echo CMD OK; fi
  • 您可以在测试其退出代码时将命令的输出分配给变量:
    if output=$(command); then echo CMD OK; fi
  • 不要使用大写变量,因为它们可能与环境和内部 shell 变量发生冲突
  • 将命令存储在变量中是不明智的:BashFAQ #50
  • NUMFAILS++:您仍然需要使用((来评估表达式:((numfails++))
  • num=$SCRIPT args:您需要使用命令替换来替换命令的输出:num=$(./script "$args")
  • args是一个变量,你需要用美元符号扩展它:"$args". 引号是必要的,以防止分词。请注意,在算术上下文中,例如((++numfails)),您不需要使用美元符号
  • 如果您的目录中没有文件,您可能希望使用shopt -s nullglob跳过循环for
  • 根据@CharlesDuffy 的建议,如果您正在使用set -e,您应该使用预增量((++numfails))((sum+=num)) || true处理set -e当任一算术表达式的结果等于 0 时会终止脚本的情况
  • 使用shellcheck
于 2017-12-11T22:35:54.117 回答