Сколько элементов может хранить массив в скрипте Unix?

Сколько элементов может хранить массив в скрипте Unix?

Мне нужно проверить права доступа к файлам каталогов /usr, /tmp, /varи их содержимое подкаталогов. Я взял права доступа к файлам каталога и его подкаталогов в массиве отдельно для каждого из /usr, /tmp, и /var:

fun() {
  set -A  PR_Uperm -- "/usr" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
  set -A  PR_Tperm -- "/tmp" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
  fun2
}

Наконец, я хочу, чтобы эти отдельные массивы были в одном массиве, который находится в другой функции, поскольку у нас есть динамическая область видимости в скриптах. Я пробовал, как показано ниже:

fun2(){
  set -A perm ${PR_Uperm[@]} ${PR_Tperm[@]}
}

При запуске скрипта возникает эта ошибка.

script.sh:79919: нижний индекс вне диапазона

когда я даю только один массивперманентная завивкамассив, как показано ниже, я не получаю никаких ошибок.

set -A perm ${PR_Tperm[@]}

Мне нужно сохранить так много записейперманентная завивкамассив. Как можно динамически увеличить размер массива?набор -Ане относится к bash, но это динамическое увеличение может быть одинаковым для bash и ksh, поэтому я его включил.

Я попробовал сохранить во временном файле, как показано ниже:

printf "/usr\n`ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`\n" >> /tmp/output2.txt  # not working in ksh, but working when I run as bash
ksh: no space

ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}' >> /tmp/output2.txt # it is working

Почему первая команда успешно выполнилась в bash, но не в ksh?

решение1

Если я правильно помню, в Bash нет встроенного ограничения на размер массива. KornShell93 поддерживает индексы размером до 64k в последних версиях (и до 4095 в более старых версиях).

Существует утилита mtree, которая используется для сравнения иерархии файлов со спецификацией. Любые отклонения от спецификации (отсутствующие файлы или каталоги, или несоответствия владения/разрешения) сообщаются и опционально исправляются (если это возможно).

Поскольку я не знаю, какой у вас Unix, я не могу подсказать вам, где найти эту утилиту. Она находится вБазовая система OpenBSD, но, очевидно, такжедоступно для Linux.

Связанный контент