是否正确编写了此脚本(迭代文件,将它们作为参数传递给另一个脚本,计算失败并汇总成功输出)?

时间:2017-12-11 22:27:01

标签: bash exitstatus

我正在研究考试练习问题,我们需要在文件上调用脚本。如果退出状态为非零,我们将失败次数增加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

1 个答案:

答案 0 :(得分: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,你应该使用preincrement ((++numfails))((sum+=num)) || true来处理set -e在结果时def imageToNumpy(): with Image.open('dark.jpg') as img: nparray = np.fromstring(img.tobytes(), dtype=np.uint8) nparray = nparray.reshape((img.size[1], img.size[0], img.layers)) return nparray cv2.imwrite("testme.png", imageToNumpy() ) 终止脚本的情况算术表达式等于0
  • 使用shellcheck