这个脚本(遍历文件,将它们作为参数传递给另一个脚本,计算失败次数并对成功输出求和)是否正确编写?

Is this script (to iterate over files, pass them as arguments to another script, count failures and sum successful outputs) correctly written?

我正在处理一道考试练习题,我们需要在其中调用文件上的脚本。如果退出状态不为零,我们将失败次数增加 1,否则我们将 sum 变量增加 1。 由于我们实际上没有这个脚本,所以我只是想验证一下我在纸上写的是否正确,假设我们调用的脚本是compute,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
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