Другая проблема заключается в том, что вы (правильно) заключаете переменную в кавычки при проверке с помощью -d
, но не заключаете ее в кавычки в цикле for
.
Вместо:
for i in $chosen_dir/*;
do
Используйте:
for f in "$chosen_dir"/*; do
(Изменение имени и пробелов - это стилевые моменты; добавленные двойные кавычки важны.)
Я не знаю, для чего вы пытаетесь использовать счетчик, потому что на самом деле вы никогда его не использовали. Вы также не сослались на $i
($f
в моей версии), который на основе приведенной выше конструкции for
будет содержать имя каждого файла (или подкаталога) в "$chosen_dir"
, по очереди.
Кстати, спасибо, что уточнили, что это домашнее задание. Могут быть гораздо более короткие решения, но ваш общий подход вполне подходит, если вы исправите синтаксические ошибки, а также приведете свои переменные.
Что касается подсчета файлов в подкаталоге, вы можете не получить точного подсчета с помощью команды, которую вы используете. (На самом деле вы никогда не получите точного подсчета с помощью команды: ls "$chosen_dir" | wc -l
, потому что вы проверяете не подкаталог, а каталог, введенный пользователем.) Вместо просто ls
можно использовать ls -1 -A "$i"
, чтобы подсчет строк дал точное количество файлов в подкаталоге. (Подробности о флагах -1
и -A
см. в man ls
)
Это все равно не будет корректно обрабатывать имена файлов, содержащие новые строки, но для домашнего задания я очень сомневаюсь, что вам снимут за это баллы. (Многие скрипты, реально используемые в производстве, также не справляются с именами файлов, содержащими новые строки; такие имена практически всегда приходят только от злоумышленников.)
Я предполагаю, что вы сможете самостоятельно разобраться с частью C. ;) (См. man sort
, если нужно, и поищите тег sort
на этом сайте)
.