如何在Bash中遍历无限长字符串前缀并循环执行foo命令
问题描述
我要运行一段名为foo的代码,它接受两个参数:由0和1组成的字符串,以及一个整数。该字符串是无限循环字符串110011001100110011...的前缀,长度不超过50。要求对每个前缀,第二个参数取1到该前缀长度的所有值,通过Bash循环执行如下示例中的命令:
foo 1 1 foo 11 1 foo 11 2 foo 110 1 foo 110 2 foo 110 3 ...
我能写出类似如下的双层循环:
for i in {1..10}; do for j in $(seq 1 $i); do foo $i $j; echo $i $j; done; done
但不知如何实现上述需求。
实现方案
思路
先构造出最长的目标循环字符串前缀(长度50的1100循环串),通过截取子串得到所有长度从1到50的前缀;再用双层循环,外层遍历每个前缀,内层遍历1到该前缀长度的整数,执行foo命令。
具体脚本
# 定义循环基本单元 base="1100" # 生成足够长的循环字符串,截取前50个字符作为最长前缀 full_str=$(printf "%0.s$base" {1..15}) full_str=${full_str:0:50} # 外层循环遍历所有前缀长度(1到50) for len in $(seq 1 ${#full_str}); do # 获取当前长度的前缀 prefix=${full_str:0:$len} # 内层循环遍历1到当前前缀长度的整数参数 for j in $(seq 1 $len); do # 执行目标命令 foo "$prefix" "$j" # 可选:打印命令用于调试,取消注释即可 # echo "foo $prefix $j" done done
关键说明
base="1100"是循环的核心单元,通过重复拼接生成足够长的字符串,再截取前50位满足最长前缀要求。${#full_str}获取字符串长度,确保外层循环覆盖所有可能的前缀长度。prefix=${full_str:0:$len}截取前len个字符,得到对应长度的前缀。- 若最长前缀长度不是50,只需修改
full_str=${full_str:0:50}中的数字为目标长度即可。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

