如何在Bash中创建带前导零的数组并规避八进制解析错误
Bash带前导零数组元素八进制解析报错的解决方案
该报错的核心原因是Bash默认将以0开头的数字字面量识别为八进制数,而08、09不属于合法八进制取值范围(八进制仅支持0-7),因此在数组下标、算术运算等算术上下文中使用这类值时就会触发报错。
可根据实际使用场景选择以下方案解决:
方案1:强制指定十进制解析,避免八进制自动识别
当必须把带前导零的字符串作为数字(如下标、运算数)使用时,添加10#前缀明确告诉Bash按十进制解析该值,修改后代码示例:#!/bin/bash hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23) for i in "${hr[@]}"; do echo ${hr[10#$i]} done算术运算场景也可使用该规则,示例:
(( result = 10#$i + 5 ))方案2:调整遍历逻辑,直接输出数组元素避免算术上下文
现有代码的遍历逻辑存在冗余:遍历${hr[@]}时拿到的i本身就是数组的元素值,不需要再通过下标去数组中取值,直接输出即可,完全不会触发数字解析逻辑,是最简单的解决方案:#!/bin/bash hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23) for i in "${hr[@]}"; do echo $i done方案3:使用内置序列生成带前导零的数组
Bash 4.0及以上版本支持带前导零的范围扩展语法,可以更简洁地生成目标数组,避免手动输入元素的冗余:#!/bin/bash hr=({00..23}) for i in "${hr[@]}"; do echo $i done
内容的提问来源于stack exchange,提问作者Oleg M
相关产品推荐
相关产品推荐

