索引数组的下标是算术扩展吗?

索引数组的下标是算术扩展吗?

引用 Bash 手册:

如果使用语法分配任何变量,则会自动创建索引数组

name[subscript]=value

下标被视为必须计算为数字的算术表达式。

subscript

  • 算术表达式,或
  • 算术扩展,其中$(())被忽略并且只有算术表达式?

换句话说,这里是否有算术展开的步骤,就像用算术展开解释命令一样?

例如,

$ declare -p myarr
declare -a myarr='([0]="0" [2]="3" [3]="9999")'

$ echo ${myarr[1+2]}
9999
$ echo ${myarr[$((1+2))]}
9999

答案1

是否有算术扩展[带有数组下标]的步骤,就像用算术扩展解释命令一样?

是的。

变量扩展:

$ unset -v a
$ declare -p a
-bash: declare: a: not found
$ x=4
$ a[x]=4
$ declare -p a
declare -a a='([4]="4")'

参数扩展:

$ six=six
$ a[${#six}]=3
$ declare -p a
declare -a a='([3]="3" [4]="4")'

命令替换:

$ a[$(echo 9)]=9
$ declare -p a
declare -a a='([3]="3" [4]="4" [9]="9")'

报价删除:

$ a["5"]=5
$ declare -p a
declare -a a='([3]="3" [4]="4" [5]="5" [9]="9")'
$ a['6']=6
$ declare -p a
declare -a a='([3]="3" [4]="4" [5]="5" [6]="6" [9]="9")'
$ a[\7]=7
$ declare -p a
declare -a a='([3]="3" [4]="4" [5]="5" [6]="6" [7]="7" [9]="9")'

参考

3.5.5 算术扩展

表达式中的所有标记都会经历参数和变量扩展、命令替换和引号删除。

答案2

  • 索引数组的下标是算术扩展吗?

准确地说:不,它是一个“算术表达式”,与“算术扩展”内部的内容相同,但缺少$(( )).

两者都会评估表达式,直到它变成数字(或空值)。

相关内容