Модераторы: powerfox, ZeeLax

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> простая задача на языке bash 
V
    Опции темы
An123
  Дата 17.10.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Разработать сценарий для поддержки базы данных входящих документов 
Документ представлен некоторым текстовым файлом. База данных - это отдельный каталог, в котором размещаются документы. Требуется
-добавить документ в базу
-просмотреть список документов
-отобразить содержимое документов
-получить объём в байтах документа
Работа с системой с помощью меню и задании параметров, необходимых для выполнения соотв. действия. После выполнения действия пользователю опять предлагается выыбрать один из пунктов меню
Завершение работы осуществляется посредством выбора Выход

Bash я начал изучать недавно(точнее вчера) и получилось что то вроде этого - некоторые пункты совсем не реализованы:
Код

#!/bin/bash 
VHOD() 
{ 
echo Введите путь к каталогу 
read FOLDER 
cd $FOLDER 
#cd /home/an/lab2 
echo Список документов в выбранном каталоге: 
ls 
} 
VHOD 
OPEN() 
{ 
count=0 
echo Введите имя файла: 
read INPUT 
until [ -e $INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 
cat $INPUT 
count=$(($count+1)) 
echo $count>/home/an/lab2/count/$INPUT 
#a=$cat(<файл>); (( a++ )); echo $a > <файл> 
} 
INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
until [ -s /home/an/lab2/count/$INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 

} 
PS3="Выберите пункт меню:" 
select ITEM in "Открыть файл" "Добавить документ в базу" "Получить объем в байтах" Выход 
do 
case $ITEM in 
"Открыть файл") OPEN;
Выход) break;; 
esac 
done

PM MAIL   Вверх
spin2
Дата 17.10.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: 5
Всего: 31



А в чем вопрос?


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
An123
Дата 17.10.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Вопрос в том как организовать это    -отобразить содержимое документов
-получить объём в байтах документа
PM MAIL   Вверх
powerfox
Дата 17.10.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(An123 @  17.10.2009,  22:31 Найти цитируемый пост)
-отобразить содержимое документов

cat somefilename


Цитата(An123 @  17.10.2009,  22:31 Найти цитируемый пост)
-получить объём в байтах документа 

Это сложнее. Что именно нужно: сколько занимает вообще, или сколько занимает на диске?
Если на диске, то можно использовать du. Тогда нужно либо парсить вывод, полученный с помощью "-h", либо думать о размере блока (без "-h" выдаётся размер в блоках).
Если объём данных, то "wc -c somefile".


--------------------
user posted image
PM WWW   Вверх
spin2
Дата 17.10.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: 5
Всего: 31



powerfox, для файла и ls -l и потом cut вполне хватит, по-моему.


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
An123
Дата 18.10.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Необходимо получить объём (в байтах) заданного документа
А про cat somefilename можно поподробнее
PM MAIL   Вверх
cutwater
Дата 18.10.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: нет
Всего: 10



Подробнее в
Код

man cat



--------------------
user posted image
PM MAIL   Вверх
powerfox
Дата 18.10.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(An123 @  18.10.2009,  11:49 Найти цитируемый пост)
Необходимо получить объём (в байтах) заданного документа

Выше я написал, как это сделать ;)

Цитата(spin2 @  18.10.2009,  00:16 Найти цитируемый пост)
powerfox, для файла и ls -l и потом cut вполне хватит, по-моему. 

Конечно.


--------------------
user posted image
PM WWW   Вверх
spin2
Дата 19.10.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: 5
Всего: 31



An123, приведенный код тобой написан? Там же уже есть строчка
Цитата

cat $INPUT 



--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
An123
Дата 31.10.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



А как можно добавить документ в базу ?
PM MAIL   Вверх
BlackRu
Дата 31.10.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



Что-то я не могу понять, почему после выполнения первой функции мы в конце остаемся в стартовой директории. Т.е. пользовательского перехода не происходит.
Или нужно перекурить read? 
Извиняюсь за оффтоп. 

Это сообщение отредактировал(а) BlackRu - 31.10.2009, 13:10


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
BlackRu
Дата 31.10.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



Код

#!/bin/bash 
VHOD() 
{ 
echo Введите путь к каталогу 
read FOLDER 
cd $FOLDER 
#cd /home/an/lab2 
echo Список документов в выбранном каталоге: 
ls 
} 
VHOD 

OPEN() 
{ 
count=0 
echo Введите имя файла: 
read INPUT 
until [ -e $INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 
cat $INPUT 
count=$(($count+1)) 
echo $count>/home/an/lab2/count/$INPUT 
#a=$cat(<файл>); (( a++ )); echo $a > <файл> 
} 
INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
ls -all $INPUT
} 


ADDD()
{
count=0
echo Введите файл:
read INPUT
touch $INPUT
}


PS3="Выберите пункт меню:" 

select ITEM in "Открыть файл" "Добавить документ в базу" "Получить объем в байтах" "Выход" 
do 

case $ITEM in 
"Открыть файл") OPEN;
esac 


case $ITEM in
"Добавить документ в базу") ADDD;
esac

case $ITEM in
"Получить объем в байтах") INFO;
esac

case $ITEM in
"Выход")
esac
break;
done

Оно?
Полный Брейк Данц в общем. 

Это сообщение отредактировал(а) BlackRu - 31.10.2009, 14:05


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
An123
Дата 31.10.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



BlackRu, спасибо большое
Только я не очень понял как происходит получение объёма в байтах
Если не сложно, ты не мог бы этот кусок пояснить :
Код

OPEN() 
{ 
count=0 
echo Введите имя файла: 
read INPUT 
until [ -e $INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 
cat $INPUT 
count=$(($count+1)) 
echo $count>/home/an/lab2/count/$INPUT 
#a=$cat(<файл>); (( a++ )); echo $a > <файл> 
} 
INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
ls -all $INPUT
} 

PM MAIL   Вверх
BlackRu
Дата 31.10.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



Код

OPEN() 
{ 
count=0 
echo Введите имя файла: 
read INPUT 
until [ -e $INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 
cat $INPUT 
count=$(($count+1)) 
echo $count>/home/an/lab2/count/$INPUT 
#a=$cat(<файл>); (( a++ )); echo $a > <файл> 
} 

Это твой кусок кода. Я не очень понимаю, почему так сделано. И кажется, он некорректно работает, каждый раз перезаписывая то ли, счетчик, то ли значение true в файл, у меня так во всяком случае. Мне кажется стоит выкинуть цикл, т.е. 
Код

OPEN() 
{ 
echo Введите имя файла: 
read INPUT 
cat $INPUT 
} 


Если нужно сделать проверку ввода, то лучше покурить насчет аналога file exist - такая фича есть в php, вероятно есть и в bash... что делает -e? - этот ключ/оператор/хз?  я не понял, поясни. 


Код

INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
ls -all $INPUT
} 

Эта функция, наскоро написанная, выводит информация о файле, там права на запись, время, размер и т.д. Если тебе надо отдельно вывести только байты, это можно сделать посредство конвеера, например использовать awk и grep, если они есть в системе, хотя есть команда size. Вариантов, много.    Но есть самый простой способ - использовать du

Код

INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
echo Размер  Имя файла; du $INPUT
} 


Или так.


Код

INFO() 
{ 
echo Введите имя файла информацию о котором хотите узнать: 
read INPUT 
ls -all $INPUT | awk  '{printf  $5}'; echo " "  байта
} 










Это сообщение отредактировал(а) BlackRu - 31.10.2009, 17:34


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
An123
Дата 31.10.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Код

OPEN() 
{ 
count=0 
echo Введите имя файла: 
read INPUT 
until [ -e $INPUT ] 
do 
echo неверный ввод, введите заново 
read INPUT 
done 
cat $INPUT 
count=$(($count+1)) 
echo $count>/home/an/lab2/count/$INPUT 
#a=$cat(<файл>); (( a++ )); echo $a > <файл> 
} 

Вот эту часть позаимствовал - так что не исключено есть косяки
А вообще как правило требуется сделать  проверку ввода, если в задании об этом ничего не сказано?
Вот эта строка как работает 
Код

ls -all $INPUT | awk  '{printf  $5}'; echo " "  байта
 
5 - это что?
PM MAIL   Вверх
BlackRu
Дата 31.10.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



Это и есть конвеер:
конвеер 
Про awk можно посмотреть Википедии.

Можно почитать до полного просветления:
Advanced bash script guide

Как зациклить скрипт? Я не берусь рассматривать это с точки зрения православного программирования, но вполне идентификатор выполнения функции можно воткнуть в саму функцию

Код

INFO()
{
echo Введите имя файла информацию о котором хотите узнать:
read INPUT
ls -all $INPUT | awk  '{printf  $5}'; echo "" байта
INFO
}


но можно зациклить сам  скрипт, так как кнопка выход все равно есть, воткнув вместо INFO имя скрипта, по которому он вызывается. Это может быть не очень правильно (так как порождается много процессов), но теоретически не должно вызвать проблем. Все зависит от целей.
Можно сделать несколько отдельных скриптов и перемещаться между ними, корректно завершая предыдущие.

Теперь мне поясните, пожалуйста, про -e. Что это? 



Это сообщение отредактировал(а) BlackRu - 15.11.2009, 04:11


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
An123
Дата 31.10.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



Спасибо за развернутый ответ smile  (правда от ссылки на конвеер мне чуть плохо не стало  smile )
Код

Теперь мне поясните, пожалуйста, про -e. Что это? 

про -e если честно объяснить сложно поскольку эта реализации 
была самым наглым образом позаимствована из другой проги 
PM MAIL   Вверх
BlackRu
Дата 31.10.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



А что не так со ссылкой на конвеер?

Все верно -e = exist.

Мне не приходилось пользоваться. 

Еще курить man test 
И мне тоже. smile

А проверка наличия файла тогда так:

Код

OPEN()
{
echo Введите имя файла
read INPUT
if [ -e  $INPUT ]; then
cat $INPUT
else
echo "Нету такого файла";
continue
fi
exit
}


Это сообщение отредактировал(а) BlackRu - 31.10.2009, 22:59


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
powerfox
Дата 31.10.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(An123 @  31.10.2009,  19:30 Найти цитируемый пост)
5 - это что? 

Столбец.


--------------------
user posted image
PM WWW   Вверх
BlackRu
Дата 1.11.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 431
Регистрация: 14.9.2009

Репутация: 2
Всего: 4



Хотя нет, не особенно процессы плодятся. Тогда можно так:
Код

OPEN() 
{
echo Введите имя файла
read INPUT
if [ ! -e $INPUT ]; then
echo Нету такого файла; OPEN
elif [  -e  $INPUT ]; then
cat $INPUT
continue
fi
}


Была еще функция return 
но не могу вспомнить было ли это в Bash smile И было ли?! В общем почти риторический вопрос

Все понял, где ты взял этот пример, но там четко сказано:

# if no 'break' here, keeps looping forever.
В общем удали break в конце и будешь счастлив.

P.S. Да, если проблема была решена, просьба - пометить вопрос как решенный.  


Это сообщение отредактировал(а) BlackRu - 1.11.2009, 18:17


--------------------
Удалена администрацией форума
PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.