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
相关产品推荐
相关产品推荐

