${LOCALSITES}+='foo'
будет интерпретировать текущее значение этой переменной, давая вам пустую строку и, следовательно, делая команду читаемой как:
+='foo'
Это можно увидеть, если вы сделаете set -x
заранее:
pax:~$ set -x ; ${xx}+='foo' ; set +x
+ set -x
+ +=foo
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/lib/command-not-found -- +=foo
+=foo: command not found
+ return 127
+ set +x
Это ничем не отличается от:
pax:~$ xx=1
pax:~$ ${xx}=2 # should be xx=2
1=2: command not found
Чтобы правильно добавить в массив, вам нужно сделать:
LOCALSITES+=('foo')
Другие вещи, которые вы можете захотите рассмотреть, любезно предоставленный Гордоном Дэвиссоном в комментарии:
- Вероятно, лучше использовать имена переменных в нижнем или смешанном регистре, чтобы избежать конфликтует со многими переменными all-caps со специальными функциями:
localsites+=('foo')
. - Убедитесь, что вы выбрали правильные кавычки для того, чтобы sh интерпретировать переменные или нет:
localsites+=('foo') ; localsites+=("${newSite}")
. - Вы почти никогда не хотите
[*]
. Вместо этого используйте [@]
и заключите в него двойные кавычки: echo "${localsites[@]}"
.