Shell脚本for循环输出格式异常求助:内容重复叠加
问题:Shell脚本输出内容叠加,无法每行输出单条数据
我需要在环境中捕获Pod内存及其他相关信息,编写了一段Shell脚本,但执行后输出内容不断叠加,而非每行输出单条指定数据。
脚本代码
LOGFILE='/root/User1/test/log' Data="" space=" " e=34 f=12Mi a=122 b=123 c=333 d=450 for i in {1..10}; do Data+=$space Data+=$a Data+=$space Data+=$b Data+=$space Data+=$c Data+=$space Data+=$d Data+=$space Data+=$e Data+=$space Data+=$f printf "%s" "$Data" >> ${LOGFILE} echo $'\n' >> ${LOGFILE} $(unset ${Data}) done
当前输出(内容叠加)
34 12Mi 122 123 333 450 34 12Mi 122 123 333 450 34 12Mi 122 123 333 450 ...(后续行持续叠加)
期望输出(每行单条数据)
34 12Mi 122 123 333 450 34 12Mi 122 123 333 450 ...(每行均为相同单条数据)
错误原因分析
- 变量累加未重置:
Data变量在循环外初始化后,每次循环都用Data+=进行内容追加,导致每轮循环都会把新数据加到已有内容后面,输出自然叠加。 unset命令使用错误:$(unset ${Data})是错误写法,unset的参数应该是变量名,不是变量值,这里写成unset ${Data}相当于尝试删除以Data内容命名的变量,完全起不到清空Data的作用。
解决方案
方案1:每次循环前重置Data变量
在循环内部开头重新初始化Data为空,避免累加:
LOGFILE='/root/User1/test/log' space=" " e=34 f=12Mi a=122 b=123 c=333 d=450 for i in {1..10}; do Data="" # 每次循环开始时清空变量 Data+=$space Data+=$a Data+=$space Data+=$b Data+=$space Data+=$c Data+=$space Data+=$d Data+=$space Data+=$e Data+=$space Data+=$f printf "%s\n" "$Data" >> ${LOGFILE} # 直接用printf换行,简化代码 done
方案2:无需使用Data变量,直接拼接输出
既然只是要输出固定格式的内容,完全可以跳过Data变量,直接用printf一次性输出,更简洁高效:
LOGFILE='/root/User1/test/log' space=" " e=34 f=12Mi a=122 b=123 c=333 d=450 for i in {1..10}; do # 固定三空格分隔的写法,可读性更强 printf "%s %s %s %s %s %s\n" "$a" "$b" "$c" "$d" "$e" "$f" >> ${LOGFILE} done
内容的提问来源于stack exchange,提问作者umer
相关产品推荐
相关产品推荐

