执行提取密度值的Bash脚本时出现command not found错误的原因
Bash脚本出现“command not found”错误的原因及修复方案
错误原因
Bash不支持嵌套关联数组(即数组元素本身是关联数组)的写法,你脚本里的data[$RUNCOUNT]['Density']属于无效语法。Shell会将data[1][Density]=12.157这类表达式当成完整的命令去执行,而该命令并不存在,因此抛出“command not found”错误。
修复方案
方案1:用复合键名模拟二维结构
在一维关联数组中,通过"$RUNCOUNT,键名"的复合键来区分不同计数对应的属性,示例:
declare -A data tempVar="" RUNCOUNT=1 FILENAME="$1" while read line do # 存储文件路径 data["$RUNCOUNT,path"]="$line" # 提取并存储密度值 density_val=$(grep "Density:" "$line" | tail -1 | grep -Eo "[[:digit:]]+[.][[:digit:]]+") data["$RUNCOUNT,Density"]="$density_val" # 输出密度值 echo "${data["$RUNCOUNT,Density"]}" RUNCOUNT=$((RUNCOUNT+1)) done < "$FILENAME"
方案2:拆分使用两个独立数组
如果不需要将路径和密度值存在同一个数组,可分别用普通数组存储文件路径和密度值:
declare -a file_paths declare -a densities RUNCOUNT=0 FILENAME="$1" while read line do file_paths[$RUNCOUNT]="$line" density_val=$(grep "Density:" "$line" | tail -1 | grep -Eo "[[:digit:]]+[.][[:digit:]]+") densities[$RUNCOUNT]="$density_val" echo "${densities[$RUNCOUNT]}" RUNCOUNT=$((RUNCOUNT+1)) done < "$FILENAME"
额外注意事项
- 变量引用时添加双引号(如
"$line"、"$FILENAME"),避免路径包含空格或特殊字符时出现解析错误。 - 优先使用
$(...)替代反引号`...`,前者可读性更强,且能避免嵌套解析问题。
内容的提问来源于stack exchange,提问作者sachin mirajkar
相关产品推荐
相关产品推荐

