Кароче, тема такая. Тут из лабораторных по линуксу попалась одна по программированию под shell. Читать и перечитывать книги неохота. А одну программку маленькую написать все таки надо Естественно она у меня не получается. Задача следующая: Есть программа, передаем в неё два параметра: первый - каталог, второй - "ключ". Программа должна вывести на экран все файлы/каталоги которые соотвествуют даному ключу. В лабораторной пишут, что имеются следующие ключи: r - файл существует и разрешён для чтения; .... f - "простой" файл; d- каталог. Вот что у меня получилось: Code: $k=0 for loop in `ls $1` do if [ test -$2 $loop ] then $k=$k+1 done echo $k Просьба исправить программу так, чтобы правильно работала. Буду благодарен.
если "ключ" совпадает с ключем команды test - то я бы сделал так: Code: for file in "$1"/* do test -$2 "$file" && echo `basename "$file"` done никаких `ls ...`, for разворачивает звездочку в список файлов. из минусов будет то, в каталоге с большим кол-вом файлов можно получить переполнение длины параметров, но зато легче. в кавычки пришлось взять чтобы корректно обрабатывать пробелы в дургие символы в имени директории. test делает свое дело, и если код возврата был нулевой, тогда выводится строка с echo, если надо имя файла с относительным путем - тогда можно без basename, но тогда всякие ../path/to/back/../../../ будут в имени файла, забыл команду которая преобразует в нормальный путь и имя файла. Code: ## каталоги [me@localhost] Videos $ ./lab.sh Planeta\ 51/ d AUDIO_TS VIDEO_TS ## файлы [me@localhost] Videos $ ./lab.sh Planeta\ 51/VIDEO_TS f VIDEO_TS.BUP VIDEO_TS.IFO VIDEO_TS.VOB VTS_01_0.BUP VTS_01_0.IFO VTS_01_0.VOB VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB ## сделаю маленькое западло, уберу право чтения с VOB-файлов. [me@localhost] Videos $ chmod -r Planeta\ 51/VIDEO_TS/*.VOB [me@localhost] Videos $ ./lab.sh Planeta\ 51/VIDEO_TS/ r VIDEO_TS.BUP VIDEO_TS.IFO VTS_01_0.BUP VTS_01_0.IFO
если надо посчитать, тогда да... счетчик k="0" for file in `ls -a "$1"/*` do test -$2 "$file" && k=$(( k+1 )) done echo $k