如何将awk数组赋值给bash数组,实现扩展与编译器映射字典?
Bash字典构建:修复扩展名数组为空问题
原代码的核心错误
- awk变量引用错误:
split($item, a, "=")中,$item是bash变量,在awk环境中未定义,应该用awk内置的$0表示当前接收的整行内容。 - for循环语法错误:
for (i=1; i <= length(a); i++); print(a[i])里的分号导致循环体为空,print语句在循环外,只会打印数组最后一个元素(编译器),后续unset extensions[-1]直接清空了数组。
修正后的完整代码
# 初始化输入数组 array=("s=c=g++" "ipynb=py") # 初始化bash关联数组(字典) declare -A ext_compiler_map for item in "${array[@]}" do # 提取编译器(最后一个等号后的内容) compiler=$(echo "$item" | awk '{split($0, a, "="); print a[length(a)]}') # 提取所有扩展名(除最后一项外的所有部分) extensions=($(echo "$item" | awk '{split($0, a, "="); for (i=1; i < length(a); i++) print a[i]}')) # 将每个扩展名与编译器绑定存入字典 for ext in "${extensions[@]}" do ext_compiler_map["$ext"]="$compiler" # 可选:打印验证扩展名 echo "扩展名: $ext" done done # 验证字典内容 echo -e "\n最终字典内容:" for ext in "${!ext_compiler_map[@]}" do echo "$ext -> ${ext_compiler_map[$ext]}" done
代码说明
- 用
$0替代$item让awk正确读取输入内容 - 调整for循环条件为
i < length(a),直接输出所有扩展名(无需后续unset操作) - 使用
declare -A创建bash关联数组,实现"扩展名:编译器"的键值对存储 - 增加了字典内容的验证输出,方便确认结果
内容的提问来源于stack exchange,提问作者qwertyuiop
相关产品推荐
相关产品推荐

