引用 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
- 索引数组的下标是算术扩展吗?
准确地说:不,它是一个“算术表达式”,与“算术扩展”内部的内容相同,但缺少$(( ))
.
两者都会评估表达式,直到它变成数字(或空值)。