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

Bash脚本打印数组指定位置时出现Bad substitution错误求助

解决Bash脚本中的"Bad substitution"错误

这个错误主要有两个核心原因,咱们一步步拆解清楚:

1. 脚本解释器不支持数组扩展语法

你的脚本开头写的是#!/bin/sh,但${arr[$a]}这种数组索引的写法是Bash专属的扩展特性。而很多Linux发行版里的sh其实是POSIX标准的dash(软链接过去的),它不支持这种数组操作语法,执行时自然会抛出"Bad substitution"错误。

2. 数组创建方式根本不对

你用arr=$(echo $user | tr " " "\n")这行代码,本质是把命令输出的整个字符串赋值给了普通变量arr,并没有创建真正的数组。哪怕换成Bash解释器,这种普通变量也没法用数组索引去访问。

修正后的脚本示例

结合你的需求,我猜你是想把cut | sort | uniq -c的每一行输出作为数组的一个独立元素,那可以这样写:

#!/bin/bash
# 用readarray直接将命令输出的每一行存入数组,-t参数会去掉每行末尾的换行符
readarray -t arr < <(cut -d ";" -f1 "$ultimocsv" | sort -d | uniq -c)
a=5
echo "${arr[$a]}"

如果你的需求是把每个空格分隔的单词(包括计数和用户名)都拆成单独的数组元素,那可以简化成这样:

#!/bin/bash
# 直接将命令输出按默认分隔符(空格、换行、制表符)拆分存入数组
arr=($(cut -d ";" -f1 "$ultimocsv" | sort -d | uniq -c))
a=5
echo "${arr[$a]}"

额外小提示

  • 记得先给变量ultimocsv赋值,不然脚本会找不到目标文件哦。
  • 引用文件名时加上双引号"$ultimocsv",能避免文件名包含空格或特殊字符时出问题。

内容的提问来源于stack exchange,提问作者andrea2296

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:29