Правильный способ проверки всего массива:
[[ ${ar[@]+set} == set ]] && echo "array has a value may be a null"
То, что вы написали, является тестом для значения с индексом 0. Эти два эквивалентны:
${ar+set}
${ar[0]+set}
Но оба будут проверять только, установлен ли массив с нулевым индексом или нет, а не весь массив, что, как я полагаю, вы имели в виду.
Но на ваш вопрос :Почему массив не установлен, если он назначен ()?
Поскольку вы не присвоили какое-либо значение,даже не нуль, к любому индексу массива.
Чтобы установить некоторый индекс (и, следовательно, массив ), вам нужно что-то вроде:
$ declare -a ar=([3]="value")
Или даже:
$ declare -a ar=([3]="")
zsh (даже в эмуляции sh или ksh )единственная из всех протестированных оболочек (как обычно, специальная ), которая объявляет массив как набор с помощью:
$ unset ar; typeset -a ar=(); echo $(typeset -p ar) ${ar[@]+set}
Вопрос из комментариев:
Thanks. Can ar[@] be replaced with ar[*] here? Are they array variables?
Нет, "${ar[*]}"
— это объединение строк всех значений массива.
Однако в этом конкретном расширении :"${ar[*]+set}" оба эквивалентны.
Из руководства (в Arrays):
If subscript is @ or *, the word expands to all members of name.
Есть два способа избежать запрета пользователю на вход в систему после истечения дней неактивности.
1-й метод:от имени администратора и выполнение " su " от имени заблокированного пользователя, запись lastlog будет обновлена, что позволит ему войти в систему. Но это не сработает, если в /etc/pam.d/system -auth и /etc/ добавлено правило «pam _lastlog inactive ». pam.d/password -auth или в /etc/pam.d/su
2-й метод:путем добавления другого временного правила PAM с использованием pam _успеха _, если модуль находится чуть выше строки правила « pam _lastlog inactive »
auth [success=1 default=ignore] pam_succeed_if.so user in username
auth required pam_lastlog.so inactive=5