Bash创建嵌套数组变量时出现bad substitution错误求助
解决bash脚本中的
bad substitution错误 错误原因
你遇到的${$1[0]}: bad substitution错误,是因为bash不支持直接通过${变量名[索引]}这种嵌套语法来引用以变量命名的数组元素,这种写法属于非法的参数替换。
另外你的脚本末尾还有一个多余的fi语句(没有对应的if),这也会导致后续语法错误,需要一并删除。
修复方案
方案1:使用nameref(推荐,bash 4.3+支持)
nameref是bash 4.3及以上版本提供的特性,可以创建变量引用,让你直接通过引用变量操作目标数组。修改后的脚本如下:
#!/bin/bash # 加引号避免路径含空格时出错 source "$PWD/data/login" # 声明nameref,将arr指向第一个参数指定的变量名 declare -n arr="$1" # 简化mysql命令中的冗余引号 mapfile -t arr < <(mysql -N "$DB" -h"$HOST" -u"$USER" -p"$PASS" -se "$2") # 直接通过arr访问数组元素 echo "${arr[0]}" echo "${arr[1]}" echo "${arr[2]}" echo "${arr[3]}"
方案2:使用eval兼容低版本bash
如果你的bash版本低于4.3,无法使用nameref,可以用eval实现间接引用:
#!/bin/bash source "$PWD/data/login" mapfile -t "$1" < <(mysql -N "$DB" -h"$HOST" -u"$USER" -p"$PASS" -se "$2") # 通过eval解析数组元素引用 eval echo "\${$1[0]}" eval echo "\${$1[1]}" eval echo "\${$1[2]}" eval echo "\${$1[3]}"
额外注意事项
- 脚本中
""$DB""这类冗余引号可以删除,直接用"$DB"即可,避免不必要的语法问题。 - 执行脚本前确保
data/login文件中正确定义了DB、HOST、USER、PASS这几个环境变量。
内容的提问来源于stack exchange,提问作者Cody Millard
相关产品推荐
相关产品推荐

