Bash脚本中如何让mid段随循环次数i重复?求语法纠错
解决方案与脚本优化
1. 实现mid段重复i次的修改方案
要在Bash中实现字符串重复指定次数,最兼容且简洁的方式是借助printf+tr命令组合,替换原有script赋值语句:
script="${intro}$(printf "%${i}s" | tr ' ' "$mid")${outro}"
原理说明:printf "%${i}s"生成包含i个空格的字符串,tr ' ' "$mid"将每个空格替换为完整的mid内容,最终得到重复i次的mid片段,再与intro、outro拼接。
如果你的Bash版本为4.0及以上,也可以用更高效的内置扩展语法:
printf -v mid_repeat "%${i}s" "" mid_repeat=${mid_repeat// /$mid} script="${intro}${mid_repeat}${outro}"
2. 脚本其他语法/逻辑问题排查与修正
- 拼写错误:
echo "starting requst $i"中的requst应为request,修正后:echo "starting request $i" - 冗余引号:
touch ../eval/"times.txt"中的引号无意义,简化为:touch ../eval/times.txt - 日志输出丢失:
/usr/bin/time -v的详细性能日志默认输出到标准错误(stderr),当前脚本仅重定向了client的标准输出(stdout),会导致time的信息仅打印在终端而非写入文件。需将stderr合并到stdout:./client 2222 -I ./images/ -L "${script}" >> ../eval/times.txt 2>&1 - 进程等待逻辑优化:原脚本中
wait会等待所有后台进程,若server未自动退出会导致脚本挂起。建议记录server的PID,仅等待当前启动的server进程:/usr/bin/time -v ./server_mimg -q 1500 -w 1 -p FIFO 2222 & server_pid=$! ./client ... wait $server_pid
修正后的完整脚本
intro="0:R:1:6,0:R:1:7,0:R:1:8,0:R:1:9,0:R:1:10,0:R:1:11,0:R:1:12,0:R:1:13,0:R:1:14,0.5:R:1:15," mid="0:r:1:0,0:b:1:0,0:s:1:0,0:v:1:0,0:h:1:0,0:r:1:0,0:b:1:0,0:s:1:0,0:v:1:0,0:h:1:0,\ 0:r:1:1,0:b:1:1,0:s:1:1,0:v:1:1,0:h:1:1,0:r:1:1,0:b:1:1,0:s:1:1,0:v:1:1,0:h:1:1,\ 0:r:1:2,0:b:1:2,0:s:1:2,0:v:1:2,0:h:1:2,0:r:1:2,0:b:1:2,0:s:1:2,0:v:1:2,0:h:1:2,\ 0:r:1:3,0:b:1:3,0:s:1:3,0:v:1:3,0:h:1:3,0:r:1:3,0:b:1:3,0:s:1:3,0:v:1:3,0:h:1:3,\ 0:r:1:4,0:b:1:4,0:s:1:4,0:v:1:4,0:h:1:4,0:r:1:4,0:b:1:4,0:s:1:4,0:v:1:4,0:h:1:4,\ 0:r:1:5,0:b:1:5,0:s:1:5,0:v:1:5,0:h:1:5,0:r:1:5,0:b:1:5,0:s:1:5,0:v:1:5,0:h:1:5,\ 0:r:1:6,0:b:1:6,0:s:1:6,0:v:1:6,0:h:1:6,0:r:1:6,0:b:1:6,0:s:1:6,0:v:1:6,0:h:1:6,\ 0:r:1:7,0:b:1:7,0:s:1:7,0:v:1:7,0:h:1:7,0:r:1:7,0:b:1:7,0:s:1:7,0:v:1:7,0:h:1:7,\ 0:r:1:8,0:b:1:8,0:s:1:8,0:v:1:8,0:h:1:8,0:r:1:8,0:b:1:8,0:s:1:8,0:v:1:8,0:h:1:8,\ 0:r:1:9,0:b:1:9,0:s:1:9,0:v:1:9,0:h:1:9,0:r:1:9,0:b:1:9,0:s:1:9,0:v:1:9,0:h:1:9," outro="0:T:1:0,0:T:1:1,0:T:1:2,0:T:1:3,0:T:1:4,0:T:1:5,0:T:1:6,0:T:1:7,0:T:1:8,0:R:1:9" touch ../eval/times.txt for i in {1..10} do echo "starting request $i" script="${intro}$(printf "%${i}s" | tr ' ' "$mid")${outro}" /usr/bin/time -v ./server_mimg -q 1500 -w 1 -p FIFO 2222 & server_pid=$! ./client 2222 -I ./images/ -L "${script}" >> ../eval/times.txt 2>&1 wait $server_pid echo "request $i complete" done
内容的提问来源于stack exchange,提问作者Izzy Handkammer
相关产品推荐
相关产品推荐

