LINUX.ORG.RU
ФорумAdmin

Заминка в простом bash-скрипте


0

1

Здраствуйте. Вот столкнулся с такой проблемой - не получается написать скрипт для выполнения такого вот:

«Для выбранного из меню файла из каталога /usr/include/linux c cуффиксом '.h' и начинающегося с символов if вывести последнюю строку и информацию о файле.»

Уже второй вечер подряд читаю маны по grep и awk. Что-то ничего не получается..

И ещё вопрос в догонку - для создания некого подобия меню используется Select?

Заранее спасибо


А про выбор файла из меню можно объяснить? Желательно кусок кода, а я постараюсь разобратся. С выводом последней строки я разобрался, осталось только меню..

Irdis
() автор топика

У меня уже голова не варит, но спать не хочется, поэтому вот, что-то написал:

#!/usr/bin/gawk
BEGIN {
	TARGETDIR = "/usr/include/linux"
	list_command = "find " TARGETDIR " -maxdepth 1 -name 'if*.h'"
	EXIT_ERROR_NOFILES = 1
	EXIT_ERROR_NOSELECTION = 2

	list_index = -1
	do {
		files_list[++list_index] = substr(next_file, length(TARGETDIR) + 2)	#files_list[0] = 0 всегда, да
		list_command |& getline next_file
	} while(TARGETDIR "/" files_list[list_index] != next_file)

	delete files_list[0]
	if(tmp = close(list_command)) {
		print "find вышел с кодом > 0, выходим на всякий случай" > "/dev/stderr"
		exit(tmp)
	}
	if(!length(files_list)) {
		print "Файлы не найдены" > "/dev/stderr"
		exit(EXIT_ERROR_NOFILES)
	}
	exit(showmenu())	#showmenu вернет код выхода
}

function showmenu() {
	for(i = 1; i <= length(files_list); i++) {
		printf("%d: %s%s", i, files_list[i], ORS)
	}
	printf("%sНомер файла: ", ORS)
	getline

	#Удалить пробелы/табы из $0
	sub(/^[ \t]*/, "")
	sub(/[ \t]*$/, "")

	tmp = strtonum($0)
	if(!tmp || !(target_file_name = files_list[tmp])) {
		print "Непонятное что-то выбрали" > "/dev/stderr"
		return EXIT_CODE_NOSELECTION
	}
	
	list_command = "tail -n 1 " TARGETDIR "/" target_file_name	#list уже ни при чем, но не важно
	list_command |& getline tmp
	if(tmp2 = close(list_command)) {
		print "tail вернул > 0, выходим" > "/dev/stderr"
		return tmp2
	}
	print tmp	#Распечаталась последняя строка файла

	#list_command = "ВАША ЛЮБИМАЯ КОМАНДА" TARGETDIR "/" target_file_name
	#list_command |& getline tmp
	#if(tmp2 = close(list_command)) {
	#	print "Моя любимая команда вернула > 0" > "/dev/stderr"
	#	return tmp2
	#}

	return 0
}
Если, конечно, подобного «меню» достаточно.

Используются расширения gawk, может не работать под другими версиями awk. Хотя, если переписать strtonum, может, и пойдет.

proud_anon ★★★★★
()
Ответ на: комментарий от Irdis

Дак надо знать, про какое меню вас спрашивают. Можте про dialog:

a=`dialog --menu FilesList 50 50 20 1 file1 2 file2 3 file3 2>&1` ; clear ; echo $a

mky ★★★★★
()

там же почти везде перевод строки в конце файла.

а так

man dialog, tac, cat ,head, tail

guilder
()

Спасибо за помощь. Сейчас попробую ваши предложения.

Просто нам задали выполнить такую лабу, но преподаватель, видимо, и сам не очень разбирается в баше. Собственно поэтому вся наша группа делает эту лабу уже 3 недели ))

Впринципе, это последнее задание в лабе, так что вроде можно тестить и сдавать.

Ещё раз спасибо )

Irdis
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.