Bash脚本:如何从指定节点9F4A重启for循环并递增
解决方案:从指定十六进制串开始递增生成符合字符集的组合
看来你想跳出全量遍历的嵌套循环,改成从9F4A这个特定点开始,按类似十六进制的递增逻辑生成后续的恢复点字符串对吧?咱们可以通过字符集索引+进位模拟的方式实现这个需求,具体步骤如下:
1. 整理字符集并初始化基础数据
先把你指定的字符集合转成数组,这样能通过索引定位每个字符的位置,方便后续的递增和进位操作:
# 定义允许使用的字符集合,按你给出的顺序排列 chars=('4' 'A' '5' '9' 'E' '3' 'F' '6' 'C' '2' '7') char_count=${#chars[@]} # 获取字符集的总长度,这里是11 # 起始恢复点 start="9F4A" # 把起始点拆分成四个单独字符 s1=${start:0:1} s2=${start:1:1} s3=${start:2:1} s4=${start:3:1}
2. 转换起始字符为数组索引
接下来需要把起始的四个字符转换成对应的数组索引,这样才能基于索引开始递增:
# 自定义函数:根据字符找到它在数组中的索引 get_index() { local target_char=$1 for idx in "${!chars[@]}"; do if [[ "${chars[$idx]}" == "$target_char" ]]; then echo "$idx" return fi done # 理论上不会执行到这里,除非起始点字符不在你的字符集里 echo "-1" } # 获取起始四个字符对应的索引 i1=$(get_index "$s1") i2=$(get_index "$s2") i3=$(get_index "$s3") i4=$(get_index "$s4")
3. 模拟递增与进位逻辑
现在就可以像计数器一样,从起始索引开始递增,处理进位(类似十六进制逢16进1,但这里是逢字符集长度进1):
# 先检查起始字符是否都在字符集中,避免后续出错 if [[ $i1 == "-1" || $i2 == "-1" || $i3 == "-1" || $i4 == "-1" ]]; then echo "起始点存在不在指定字符集里的字符,请检查!" exit 1 fi echo "从$start开始生成恢复点:" while true; do # 输出当前的恢复点组合 echo "${chars[$i1]}${chars[$i2]}${chars[$i3]}${chars[$i4]}" # 先递增最后一位的索引 ((i4++)) # 处理最后一位的进位 if ((i4 >= char_count)); then i4=0 ((i3++)) # 处理第三位的进位 if ((i3 >= char_count)); then i3=0 ((i2++)) # 处理第二位的进位 if ((i2 >= char_count)); then i2=0 ((i1++)) # 处理第一位的进位,到这里如果溢出就停止遍历 if ((i1 >= char_count)); then echo "所有可能的恢复点已遍历完毕" break fi fi fi fi # 如果需要循环生成(遍历完最后一个后回到起始点继续),可以替换上面的break为: # i1=$(get_index "$s1") # i2=$(get_index "$s2") # i3=$(get_index "$s3") # i4=$(get_index "$s4") done
4. 完整脚本示例
把上面的代码整合起来,就是可以直接运行的完整脚本:
#!/bin/bash chars=('4' 'A' '5' '9' 'E' '3' 'F' '6' 'C' '2' '7') char_count=${#chars[@]} start="9F4A" s1=${start:0:1} s2=${start:1:1} s3=${start:2:1} s4=${start:3:1} get_index() { local target_char=$1 for idx in "${!chars[@]}"; do if [[ "${chars[$idx]}" == "$target_char" ]]; then echo "$idx" return fi done echo "-1" } i1=$(get_index "$s1") i2=$(get_index "$s2") i3=$(get_index "$s3") i4=$(get_index "$s4") if [[ $i1 == "-1" || $i2 == "-1" || $i3 == "-1" || $i4 == "-1" ]]; then echo "起始点存在无效字符,请检查!" exit 1 fi echo "从$start开始生成恢复点:" while true; do echo "${chars[$i1]}${chars[$i2]}${chars[$i3]}${chars[$i4]}" ((i4++)) if ((i4 >= char_count)); then i4=0 ((i3++)) if ((i3 >= char_count)); then i3=0 ((i2++)) if ((i2 >= char_count)); then i2=0 ((i1++)) if ((i1 >= char_count)); then echo "所有恢复点遍历完成" break fi fi fi fi done
补充说明
- 递增顺序完全由你定义的字符集顺序决定,比如你的字符集里
A后面是5,9后面是E,所以9F4A的下一个恢复点是9F45,再下一个是9F49,以此类推。 - 如果需要循环生成(遍历完所有组合后回到
9F4A继续),可以把脚本里的break替换成起始索引的重置代码。
内容的提问来源于stack exchange,提问作者BashScript
相关产品推荐
相关产品推荐

