nullglob и массивы

Я могу создать массив, а затем удалить из этого массива

$ foo=(a b c)

$ unset foo[0]

$ echo ${foo[*]}
b c

Однако, если установлено nullglob, я не могу удалить из массива

$ shopt -s nullglob

$ foo=(a b c)

$ unset foo[0]

$ echo ${foo[*]}
a b c

person Steven Penny    schedule 09.04.2013    source источник


Ответы (1)


unset 'foo[0]'

Bash считает, что var[1] является глобусом, не находит файла, который соответствует ему, и по инструкции nullglob удаляет его, в результате чего ваш скрипт запускает unset вместо unset var[1] - и ничего не сбрасывается. Правильный способ решить эту проблему — заключить имя переменной в кавычки (и всегда явно указывать -v): unset -v 'var[1]'.

nullglob

person Steven Penny    schedule 09.04.2013
comment
Я потратил два дня и, наконец, обнаружил, что виновником был nullglob! Спасибо за правильный способ использования unset - person Felipe Alvarez; 02.06.2015
comment
С переменной в качестве нижнего индекса используйте двойные кавычки, например: `unset -v var[$subscript]. - person Ingo Karkat; 20.10.2018