You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:30:50