Несколько предостережений относительно предыдущего ответа:
Первое: я вижу эту ошибку все время. Когда вы предоставляете элемент массива для «unset», вы должны заключить его в кавычки. Обратите внимание:
$ echo foo > ./a2
$ ls a[2]
a2
$ a2="Do not delete this"
$ a=(this is not an array)
$ unset -v a[2]
$ echo "a2=${a2-UNSET}, a[]=${a[@]}"
a2=UNSET a[]=this is not an array
Что случилось? Подстановка. Вы, очевидно, хотели удалить элемент 2 из [], но синтаксис оболочки был таким, какой он есть, оболочка сначала проверила текущий каталог на наличие файла, который соответствует шаблону glob"a [2]". Если он находит совпадение, он заменяет шаблон глобуса на это имя файла, и вы решаете, какую переменную удалить, основываясь на том, какие файлы существуют в вашем текущем каталоге.
Это глубоко глупо. Но это не то, что кто-то удосужился исправить, по-видимому, и ошибка появляется во всех видах документации и примеров кода за последние 3 десятилетия.
Следующая проблема связана с тем, что элементы вашего ассоциативного массива легко вставлять с любым ключом, который вам нравится. Но сложнее удалить этих элементов:
typeset -A assoc
key="foo] bar"
assoc[$key]=3 #No problem!
unset -v "assoc[$key]" #Problem!
В bash вы можете сделать это:
unset -v "assoc[\$key]"
В Korn Shell вы должны сделать это:
unset -v "assoc[foo\]\ bar]"
Так что все становится немного сложнее в случае, когда ваши ключи содержат синтаксические символы.