Shell脚本中如何将两位数作为数组单个元素存储的求助
解决Shell脚本中多位数作为数组单个元素的问题
我明白你的问题了——你想把输入字符串里的多位数完整存入数组,而不是拆成单个数字。咱们来一步步修复这个脚本:
原脚本的核心问题
- 遍历逻辑缺陷:你用
for循环逐个字符遍历,遇到两位数字时没有跳过已经处理的第二个字符,导致下一轮循环又重复处理了它; - 数组语法错误:比如
num+=${string[i]}${string[i+1]}这种写法不是往数组里添加元素,而是把字符串拼接到num变量上,正确的数组追加应该用num+=("元素内容"); - 边界处理缺失:没有考虑数字在字符串末尾的情况,容易出现越界错误。
修正后的脚本
#!/bin/bash echo "Enter your alphanumeric string: " read a # 初始化数组 declare -a alpha declare -a num i=0 len=${#a} while (( i < len )); do # 提取当前位置的字符 current_char=${a:i:1} if [[ $current_char =~ [a-zA-Z] ]]; then # 是字母,添加到alpha数组 alpha+=("$current_char") ((i++)) elif [[ $current_char =~ [0-9] ]]; then # 是数字,检查下一个字符是否也是数字 next_char=${a:i+1:1} # 确保下一个字符存在且是数字 if [[ $next_char =~ [0-9] && (i+1) < len ]]; then # 两位数字作为单个元素存入num数组 num+=("${current_char}${next_char}") ((i+=2)) # 跳过已处理的第二个数字 else # 单个数字存入num数组 num+=("$current_char") ((i++)) fi else # 遇到非字母数字字符,直接跳过(可根据需求调整处理逻辑) ((i++)) fi done # 验证数组内容(可选,用于调试) echo "=== 数组内容验证 ===" for idx in "${!num[@]}"; do echo "num[$idx] = ${num[$idx]}" done for idx in "${!alpha[@]}"; do echo "alpha[$idx] = ${alpha[$idx]}" done # 生成最终输出 echo -n "=== 最终结果 ===" for idx in "${!alpha[@]}"; do char=${alpha[$idx]} repeat_count=${num[$idx]} # 循环打印指定次数的字母 for ((j=0; j<repeat_count; j++)); do echo -n "$char" done done echo ""
关键改进点说明
- 改用while循环:相比固定步长的
for循环,while可以灵活控制索引i的增量——遇到两位数字时直接让i+2,避免重复处理; - 正确的数组操作:用
alpha+=("$current_char")和num+=("${current_char}${next_char}")确保每个元素被正确存入数组; - 边界检查:添加
(i+1) < len避免处理字符串最后一个字符时的越界问题; - 清晰的验证环节:打印数组内容方便你确认多位数是否被正确存储。
测试效果
当你输入a12b20时,输出会是:
Enter your alphanumeric string: a12b20 === 数组内容验证 === num[0] = 12 num[1] = 20 alpha[0] = a alpha[1] = b === 最终结果 ===aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbb
完全符合你想要的:把12、20作为单个数组元素,最终输出对应次数的字母。
内容的提问来源于stack exchange,提问作者Bharath G Kumar
相关产品推荐
相关产品推荐

