Bootstrap

【shell编程】报错信息:syntax error near unexpected token、bad array subscript、declare: -A: invalid option

大家好,我是摇光~

在使用Shell脚本时,特别是涉及到数组或关联数组(Associative Arrays)的操作时,可能会遇到一些常见的错误。

在处理这些错误之前,我们先来了解一下Linux下的数组和关联数组。(我尽量简短解释一下)

  • 数组:是一种通过索引来访问元素的集合,索引通常是从 0 开始的整数。
  • 关联数组:是一种通过(key)来访问值的集合,类似于其他编程语言中的哈希表或字典。(注:Bash 4.0 及以上版本支持关联数组。
# 下面是shell脚本中,是数组的用法:
# ---------------------------------------------------

# 定义:括号定义数组,元素之间用空格分隔
my_array=(apple banana cherry)		

# 访问:第一个元素(索引从0开始)
echo ${my_array[0]}  # 输出 apple
# 访问:所有元素
echo ${my_array[@]}  # 输出 apple banana cherry

# 添加:新元素到数组末尾
my_array+=("date")

# 获取:数组的长度
echo ${#my_array[@]}  # 输出 4
# 下面是shell脚本中,是关联数组的用法:
# ---------------------------------------------------

# 定义:使用 `declare -A` 命令声明关联数组
declare -A my_assoc_array

# 赋值:通过键来赋值
my_assoc_array["name"]="Alice"
my_assoc_array["age"]="30"

# 访问:通过键来访问值
echo ${my_assoc_array["name"]}  # 输出 Alice

# 获取:所有键
echo ${!my_assoc_array[@]}  # 输出 name age
# 获取:所有值
echo ${my_assoc_array[@]}  # 输出 Alice 30

以下是一些典型的报错信息、原因以及相应的解决方案。


1. 错误信息:bash: syntax error near unexpected token (`

  • 原因: 在Bash中声明数组时,如果使用的是较老版本的Bash(4.0以下),它不支持关联数组,或者语法使用错误。

  • 案例:

# 尝试声明一个关联数组(在Bash 4.0以下版本)
declare -A my_array
my_array["key1"]="value1"
  • 解决方案

1、使用 bash --version 来检查 Bash 的版本。
2、如果版本正确,确保语法正确,关联数组使用declare -A来声明。

2. 错误信息:bash: my_array: bad array subscript

  • 原因: 尝试访问一个未声明为关联数组的数组的键,或者键的格式不正确(如使用了空格或特殊字符)。

  • 案例:

my_array=("value1" "value2")	# 声明一个普通数组
echo ${my_array["key1"]}  		# 错误地尝试以关联数组的方式访问
  • 解决方案:

1、先检查一下数组是普通数组还是关联数组,关联数组使用declare -A来声明
2、再看一下访问方式,如果普通数组直接用下标访问,关联数组需要用 Key 值。

3. 错误信息:bash: declare: -A: invalid option

  • 原因: 使用的Shell环境不支持关联数组(如Dash而不是Bash)。

  • 案例:

#!/bin/sh
declare -A my_array  # 在Dash中运行会报错
  • 解决方案:

1、确保脚本使用Bash来执行,可以看脚本的第一行是不是指定#!/bin/bash。
2、在执行脚本时,确保使用bash script.sh而不是sh script.sh。

4. 错误信息:reference to undeclared array element

  • 原因: 尝试访问一个未初始化的数组元素。

  • 案例:


my_array=()				# 声明数组但未初始化任何元素
echo ${my_array[0]}  	# 尝试访问第一个元素,但它是未定义的
  • 解决方案:

1、查找到数组定义语句,再看是否在访问数组元素之前,该元素已被正确初始化。
2、如果没有初始化,普通数组可以使用 my_array+=("data")、关联数组可以使用my_assoc_array["age"]="30"进行添加数据,再进行访问。

5. 错误信息:syntax error: invalid arithmetic operator (error token is “…”)

  • 原因: 尝试在数组操作中使用了不支持的语法,如在不支持的范围操作中使用了…。

  • 案例:

#!/bin/bash
result=$((2^3))  	# 错误:Bash 不支持 '^' 作为幂运算符

result=$((2**3))  			# 正确:Bash 4.1 及以上版本支持
result=$(echo "2^3" | bc)  	# 正确:适用于所有 Bash 版本
echo $result

str="hello"
result=$((str + 1))  		# 错误:尝试对字符串进行算术运算
echo $result
  • 解决方案:

以上的这些通常发生在算术运算表达式中使用了无效的操作符或格式不正确。
只需要确保你当前的版本适不适合你学的代码。


上面有些错误属于一些基础知识,如果想学习一些Linux基础知识可以转自:Linux零基础快速入门(非常详细),全覆盖Linux的基础知识,写得比较全。

以上就是shell脚本运行出现“Array or Associative Array Issues”错误的一些原因和解决方法。

希望对你找出bug有用~

;