这个脚本(遍历文件,将它们作为参数传递给另一个脚本,计算失败次数并对成功输出求和)是否正确编写?
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
我正在处理一道考试练习题,我们需要在其中调用文件上的脚本。如果退出状态不为零,我们将失败次数增加 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