数组变量何时代表整个数组,何时代表以“0”索引的元素?

数组变量何时代表整个数组,何时代表以“0”索引的元素?

Bash 手册说:

引用不带下标的数组变量相当于引用下标为 0 的数组变量。

在 Bash 或 POSIX shell 中,对于数组变量何时表示整个数组以及何时表示由 索引的元素,是否有一些通用规则0

例如,

  1. 看起来declare数组变量之后表示整个数组,而在参数扩展中,它表示索引为的元素0

    $ declare -p x
    declare -a x='([1]="b" [2]="c")'
    $ echo $x
    
  2. 在 中[[ -v myarr ]], 是否myarr表示数组或myarr[0]

答案1

我认为你的困惑在于这个词“参考。”

你不参考毕竟数组变量declare;你只是给出了名字x

要引用变量,您必须在$名称前加上 。

尝试在 bash 手册页中搜索 的所有实例referenc并阅读它们。


至于第二个问题:

在 中[[ -v myarr ]], 是否myarr表示数组或myarr[0]

通过测试,这意味着myarr[0]

$ declare -p myarr
bash: declare: myarr: not found
$ myarr=()
$ declare -p myarr
declare -a myarr='()'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
$ myarr+=([1]=b)
$ declare -p myarr
declare -a myarr='([1]="b")'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ myarr+=([0]=q)
$ declare -p myarr
declare -a myarr='([0]="q" [1]="b")'
$ echo $myarr
q
$ [[ -v myarr ]] && echo is set
is set
$ [[ -v myarr[0] ]] && echo is set
is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ 

答案2

您将变量与表示“变量名称”的字符串混合在一起。

A$variable是变量,variable只是一个字符串,被某些命令解释为变量。

尝试这个:

$ a=x
$ x=(111 222 333)
$ declare -p $a
declare -a x='([0]="111" [1]="222" [2]="333")'

变量 a ( ) 的扩展$a给出了 string x,它被声明解释为“变量名”,然后扩展并打印。

测试[[ -v myarr ]]还将字符串解释myarr为变量,因此它始终是整个变量。

尝试

$ a=myarr
$ unset myarr
$ [[ -v $a ]] && echo set || echo unset
unset

$ myarr[5]=five
$ [[ -v $a ]] && echo set || echo unset
set

相关内容