Bash 手册说:
引用不带下标的数组变量相当于引用下标为 0 的数组变量。
在 Bash 或 POSIX shell 中,对于数组变量何时表示整个数组以及何时表示由 索引的元素,是否有一些通用规则0
?
例如,
看起来
declare
数组变量之后表示整个数组,而在参数扩展中,它表示索引为的元素0
:$ declare -p x declare -a x='([1]="b" [2]="c")' $ echo $x
- 在 中
[[ -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