如何用Shell脚本将文件内整数转换为10位ASCII游戏风格统计条
原脚本存在的核心问题
- 读取逻辑完全不匹配多行文件结构:直接将整个文件的多行内容一次性存入
intNumber变量,后续seq 1 $intNumber会因为传入的是带换行的多个数值参数,直接触发seq参数报错,无法启动循环。 - 循环层级错位:没有将「逐行读取每个整数」作为最高优先级的处理步骤,哪怕能正确读取单个整数,第二个循环从
$intNumber起始值打印-的逻辑,会导致总长度超出10位的要求——比如n=3时,seq从3遍历到10会生成8个-,拼接3个*总长度达11,不符合固定10位的输出规则。 - 输出缺少行分隔:所有echo命令都加了
-n参数抑制换行,哪怕正确拼接出单条统计条,所有内容都会挤在同一行,无法实现一行对应一个整数的输出要求。
符合需求的实现方案
方案1:纯Shell通用版本(兼容所有POSIX环境)
#!/bin/bash # 逐行读取目标文件内容 while read -r current_num do # 跳过可能存在的空行 [ -z "$current_num" ] && continue # 生成对应数量的* star_part=$(printf '*%.0s' $(seq 1 $current_num)) # 生成剩余长度的-,总长度固定为10 dash_part=$(printf '-%.0s' $(seq 1 $((10 - current_num)))) # 输出单条统计条,自动带行尾换行 echo "${star_part}${dash_part}" done < /home/intNumbers.txt
该方案特性:
- 逐行处理逻辑适配多行文件结构,不会出现一次性读取多值触发的命令报错
- 精准控制*和-的数量,总长度严格保持10位
- 输出自动带行分隔,匹配一行一个统计条的要求
方案2:轻量化一行命令实现
awk '{printf "%s%s\n", substr("**********",1,$1), substr("----------",1,10-$1)}' /home/intNumbers.txt
该方案通过直接字符串截取生成统计条,无循环调用开销,处理大文件速度更快。
输出效果验证
针对示例输入:
6 2 3 4 3
两个方案都会生成如下对应输出:
******---- **-------- ***------- ****------ ***-------
内容的提问来源于stack exchange,提问作者1511
相关产品推荐
相关产品推荐

