Есть несколько опечаток в вашем скрипте
Когда я запускаю его, как это, я получаю следующие сообщения об ошибках от BASH:
1. animals: [horse]: must use subscript when assigning associative array
2. [: missing `]'
Первый говорит, что если вы хотите использовать horse
как индекс для ассоциативного массива, вам нужно присвоить ему значение. Пустое значение (null) - это нормально.
-animals+=([horse])
+animals+=([horse]=)
Второе сообщение говорит, что вам нужно отделить значение, которое вы хотите проверить и кронштейн, так как квадратная скобка считается частью значения, если не отделены друг от друга пробелами
-if [ -z "$animals[horse]"]; then
+if [ -z "$animals[horse]" ]; then
Наконец, элемент в ассоциативном массиве существует, когда есть назначенное ему значение (даже если это значение равно null). Поскольку вопрос о тестировании, если значение массива устанавливается уже answered on this site, мы можем позаимствовать решение
-if [ -z "$animals[horse]"]; then
+if [ -n "${animals[horse]+1}" ]; then
Для Вашего удобства здесь полный сценарий:
declare -A animals=()
animals+=([horse]=)
if [ -n "${animals[horse] + 1}" ]; then
echo "horse exists";
fi
К сожалению, ... что это значит '=' в конце строки «животных + = ([лошадь] =)» – sensorario
Это присвоение пустого значения индекса 'horse'. 'animals + = ([horse])' даст синтаксическую ошибку в противном случае. – anubhava