Bash脚本修复:统计1到4321范围内数字5出现的次数
修复统计1-4321中数字"5"出现次数的Bash脚本
原脚本运行结果为0的核心问题及修复方案如下:
原脚本的问题
- 子shell变量隔离:
for...done | while...的管道会让while循环运行在子shell中,子shell内修改的count5变量无法同步到父shell,最终输出的始终是初始值0。 - 无效的管道输出:最后
| echo "${count5}"完全冗余,while循环没有输出内容,且echo调用的是父shell未被修改的变量。 - 低效的字符判断:用
grep判断单个字符是否为5,既冗余又影响效率。
修复后的脚本
#!/bin/bash typeset -i count5=0 # 用进程替换替代管道,避免子shell隔离变量 while read -n1 digit ; do # 直接判断字符是否为5,无需grep if [ "${digit}" = "5" ]; then count5=$((count5 + 1)) fi done < <(for n in {1..4321}; do echo -n "${n}"; done) # 循环结束后直接输出统计结果 echo "${count5}"
关键修改点
- 用进程替换(
< <(...))替代管道,让while循环运行在当前shell中,确保count5变量的修改能被保留。 - 给
echo加上-n参数,去掉数字后的换行符,避免把换行符当作无效字符被读取统计。 - 替换字符判断逻辑为直接比较
"${digit}" = "5",更高效准确。 - 用标准的Bash整数写法
$((count5 + 1))更新计数,避免原写法的兼容性问题。 - 移除最后无效的管道,直接在循环结束后输出统计结果。
运行修复后的脚本,将得到正确结果1262。
内容的提问来源于stack exchange,提问作者jenna
相关产品推荐
相关产品推荐

