我想数成功被处决文件,但我无法让它消失。
这就是我所拥有的:
successfulScripts=0
allScripts=0
commandline=$(find . -name "*.sh" -exec '{}' \;)
if [ $commandline -gt 0 ]; then
successfulScripts=$(($successfulScripts+1))
allScripts=$(($allScripts+1))
else
allScripts=$(($allScripts+1))
fi
echo "$successfulScripts out of $allScripts scripts were executed successfully"
我不介意是否也显示脚本内容,但是有什么办法可以鄙视它吗?
答案1
您可以只find
使用脚本返回的值。例如
find . -name "*.sh" -exec '{}' \; -print
将执行脚本,然后-print
仅打印返回 0 的脚本的名称。输出将与脚本的输出交错,因此也许您只想将脚本输出重定向到其他地方。另一方面,如果您想在最后打印一个漂亮的摘要,也许您正在寻找类似的内容:
{ find . -name '*.sh' -exec sh -c 'if "$1" >&3; then
echo success; else echo fail; fi' _ {} \; \
| awk '/success/{s++} /fail/{e++}
END {printf "%d successes out of %d\n", s, s + e}
'; } 3>&1
答案2
如果您的脚本少于 100 个:
find . -name "*.sh" | parallel
echo $? jobs failed
如果您有超过 100 个脚本:
find . -name "*.sh" | parallel --joblog my.log
echo $(cut -f 7 my.log | grep -c '^0$') succeeded
答案3
你的变量commandline
将包含输出命令find
和所有脚本的。没有其他的。
如果你想运行所有.sh
文件并统计有多少个成功执行,那就更容易了
shopt -s globstar nullglob dotglob
set -- ./**/*.sh
printf 'Testing %d scripts...\n' "$#"
success=0
for script do
"$script" && success=$(( success + 1 ))
done
printf '%d out of %d finished successfully\n' "$success" "$#"
我设置的 shell 选项使**
glob 能够递归地匹配到子目录 ( globstar
),使不匹配的模式消失而不是保持未展开 ( nullglob
),并使模式匹配隐藏名称 ( dotglob
)。
然后,代码将位置参数设置为带有.sh
文件名后缀的文件的路径名列表。该循环遍历列表并尝试运行每一个。如果运行成功,计数器就会增加。
最后输出计数器。
特殊值$#
是位置参数列表的长度(找到的脚本的数量)。
请注意,此代码不关心输出对于任何脚本,只有它们的退出状态。
使用find
,您可以输出每次运行的退出状态,然后对这些进行计数:
find . -type f -name '*.sh' -exec sh -c '
for script do
"$script" >/dev/null
printf "%d\n" "$?"
done' sh {} + |
awk '$1 == 0 { success++ }
END { printf("%d out of %d succeeded\n", success, NR) }'