Я думаю, ваше замешательство связано со словом «ссылка».
Вы не ссылаетесь на переменную массива после объявить
вообще; вы указываете только имя 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
$
Вы смешиваете переменные со строками, представляющими «имена переменных».
$ переменная
- это переменная, переменная
- это просто строка, которая интерпретируется как переменная некоторыми командами.
Попробуйте следующее:
$ a=x
$ x=(111 222 333)
$ declare -p $a
declare -a x='([0]="111" [1]="222" [2]="333")'
Расширение переменной a ( $ a
) дало строку 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