【问题标题】:Bad Substitution when I try to print a specific position of array当我尝试打印数组的特定位置时替换错误
【发布时间】:2018-09-05 13:21:59
【问题描述】:

我开始使用 bash 编程,我想打印数组的特定位置,但是当我尝试时出现此错误:错误替换

#!/bin/sh
user=`cut -d ";" -f1 $ultimocsv | sort -d | uniq -c` 
arr=$(echo $user | tr " " "\n")
a=5
echo "${arr[$a]}"   #Error:bad substitution

为什么?

【问题讨论】:

  • 你是如何运行脚本的?
  • 您在数组和用于运行命令、捕获和命令输出的命令替换语法$(..) 之间感到困惑。 arr=$(echo $user | tr " " "\n") 部分执行后者并将输出存储在变量 arr 而不是数组中。此外,您正在运行 POSIX bourne shell sh 作为 she-bang(#!/bin/sh) 解释器集,它不支持数组! "${arr[$a]}" 表示从数组的索引 a 打印元素。
  • 您需要使用bash shell 运行脚本,即bash <scriptname> 或将解释器设置为#!/usr/bin/env bash 并以./<scriptname> 运行它,在这种情况下您可以执行arr=( $(echo $user | tr " " "\n") ),即但不推荐,因为它会对存在的值进行分词。
  • 数组更多地用于存储单个命令的多个参数,而不是实现任意容器。在其他语言中,许多被认为是好的设计并不真正适用于 shell 编程。

标签: bash sh


【解决方案1】:

您正在使用不支持数组的“sh”。即使你使用“bash”,你也会得到同样的错误,因为“arr”不会是一个数组。我不确定,如果“uniq”处的“-c”是你想要的。

我想,这就是你要找的东西:

#!/bin/bash
mapfile -t arr < <( cut -d ";" -f1 $ultimocsv | sort -d | uniq )
a=5
echo "${arr[$a]}"

即使您的文件的唯一行少于 5 行,这也不会给出错误,因为 bash 将为已定义但为空的数组返回一个空字符串。

它甚至可以与“uniq -c”一起使用,因为它会将完整的行放入数组中。

【讨论】:

  • 您不会在 bash 中遇到错误替换错误。数组语法可以与非数组一起使用;你只是没有得到有意义的价值。 ${nonarray[0]}${nonarray} 是等价的,${nonarray[i]} 对于任何非零的 i 扩展为一个空字符串。
猜你喜欢
  • 2021-06-28
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多