You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:34:52