Shell脚本读取文件数值循环复制内容次数异常求助
问题分析与修复方案
首先,你的脚本存在几个关键问题,导致循环次数不符合预期,同时也没实现“每次复制后添加空行”的需求,我来逐个拆解并修复:
1. 错误的数值读取逻辑
你的FILE.txt第一行是类似90 Abcbaahjfh ...的格式,但你用sed -n '1 p' FILE.txt读取的是整行内容,这会让num变量包含后面的字符串,而非纯数字。后续循环时这个非纯数字变量会直接导致循环逻辑失效。
修正方式:用awk提取第一行的第一个纯数字字段:
num=$(awk '{print $1}' FILE.txt)
2. POSIX Shell不支持变量的大括号展开
你用的是#!/bin/sh(POSIX标准Shell),而{1..$num}是Bash专属的特性,并且变量在大括号展开阶段不会被解析,所以这个循环根本没按照num的数值执行,这也是你只复制4次的核心原因。
修正方式:改用兼容POSIX标准的while循环,或者用seq命令生成循环序列:
# 方式1:用seq生成循环序列(多数系统默认支持) for i in $(seq 1 $num); do # 循环内容 done # 方式2:用while循环(完全兼容POSIX标准) i=1 while [ $i -le $num ]; do # 循环内容 i=$((i + 1)) done
3. 缺失“复制后添加空行”的逻辑
原脚本只是单纯追加文件内容,没有添加空行的步骤,需要在每次cat操作后追加一个空行。
完整修正后的脚本
综合以上修复,最终脚本如下:
#!/bin/sh # 读取FILE.txt第一行的第一个数字作为循环次数 num=$(awk '{print $1}' FILE.txt) # 用while循环实现POSIX兼容的次数循环 i=1 while [ $i -le $num ]; do # 追加distance_k.txt内容到distance.txt cat distance_k.txt >> distance.txt # 追加空行 echo "" >> distance.txt i=$((i + 1)) done
额外优化建议
如果不想在最后一次复制后多一个空行,可以调整逻辑避免末尾冗余空行:
#!/bin/sh num=$(awk '{print $1}' FILE.txt) # 先复制一次,避免开头空行 cat distance_k.txt >> distance.txt # 剩下的n-1次,每次先加空行再复制内容 i=2 while [ $i -le $num ]; do echo "" >> distance.txt cat distance_k.txt >> distance.txt i=$((i + 1)) done
内容的提问来源于stack exchange,提问作者Binh Thien
相关产品推荐
相关产品推荐

