BASH Shell数组迭代异常求助:如何输出索引与对应ID
问题解决:printAlpha函数输出每个ID的索引及ID
问题根源
- 数组赋值错误:原代码中
declare -a alpha=$(cat ... | awk ...)会把awk的所有输出按默认分隔符(空格、换行等)分割成数组元素,无法保证每行一个ID,甚至可能将单个ID拆分成多个元素。 - 循环输出错误:使用
${alpha[*]}会打印数组所有元素,而非当前索引对应的单个ID。 - 索引起始值不符:示例要求索引从1开始,原代码从0开始。
修正方案(推荐bash 4+版本)
用readarray(bash 4.0+支持)直接按行读取内容到数组,确保每行一个元素:
function printAlpha() { # 读取awk处理后的每行到数组,-t去除换行符 readarray -t alpha < <(awk -F ":" '{print $2}' ./bin/data/ids_alpha.txt) local length=${#alpha[@]} for (( i = 0; i < length; i++)); do # 索引从1开始,输出当前索引+1和对应ID echo -e "${color_normal} $((i+1)) ${alpha[$i]} ${color_off}" done }
兼容旧bash版本的方案
如果使用bash 4.0以下版本,用while循环逐行读取并构建数组:
function printAlpha() { declare -a alpha # 逐行读取awk输出,添加到数组 while IFS= read -r line; do alpha+=("$line") done < <(awk -F ":" '{print $2}' ./bin/data/ids_alpha.txt) local length=${#alpha[@]} for (( i = 0; i < length; i++)); do echo -e "${color_normal} $((i+1)) ${alpha[$i]} ${color_off}" done }
关键说明
readarray -t:按行读取输入,自动将每行作为数组的一个元素,-t参数会移除每行末尾的换行符。< <(command):进程替换,将awk命令的输出作为readarray或while循环的输入,避免创建临时文件。${alpha[$i]}:访问数组中索引为i的单个元素,替代原代码中输出所有元素的${alpha[*]}。$((i+1)):将循环的0起始索引转换为1起始,符合示例要求。
内容的提问来源于stack exchange,提问作者Connor-Tozer
相关产品推荐
相关产品推荐

