Стишок
написала 11 ноября 2012 года в 14:09 (4739 просмотров)
Ведет себя
как Ненси; открыла 1 тему в форуме, оставила 12 комментариев на сайте.
Добрый день. Ребят нужна помощь. Я в Linux не разбираюсь хоть и прочитала много книг. А практическое задание к курсовой нужно сдать уже на следующей недели. Если не сложно не помогли бы вы разобраться. Вот задание: Разработка командной процедуры в Unix, позволяющей добавлять строки как в конец, так и в начало заданного файла. Все это с использование языка sh. Вот что я написала:
#!/bin/sh
echo -ne «конец\n»>>file1.txt
OLD=’cat file1.txt
echo -ne «начало\n$OLD>file1.txt
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Ну, по-идее, это почти должно работать. Только в строчке OLD=`cat file1.txt` обратите внимание на используемые кавычки: надо как у меня выделять обратными кавычками, которые можно найти на клавиатуре на клавише которая прямо под Esc, рядом с 1.
А насчёт того, чтобы именно процедуру… Не совсем понятно как эта процедура должна выглядеть. Тут надо перечитать всё что препод рассказывал, и найти какой-нибудь пример со словами «командная процедура» за его авторством. Потому как можно, допустим, создать функцию:
function my-proc () {
бла-бла-бла
}
Можно создать скрипт, как у вас, повесить на него бит +x положить куда-нибудь в $PATH и использовать как команду.
Кроме того непонятно как эта командная процедура должна решать вопрос: куда добавлять, в начало или в конец?
rghost.ru/private/41524664/5cf1917b7b817cf69d962e14691efab8
вот ссылка на задание. преподаватель утверждает что это настолько легко, что он не собирается помогать. Так что вся надежда только на вашу помощь.
Надо задать вопрос преподу, что он имеет в виду говоря слово «процедура». Как бывший студент, я уверен что будет лучше, не спрашивая препода заглянуть в конспект, там почти наверняка это написано, и спрашивать препода об этом, значит лишний раз демонстрировать игнорирование предмета. Если конспекта нет, значит он есть у одногруппника. Если у одногруппников нет, значит надо идти к одногруппнице-отличнице.
Да, и в чём проблема-то? В том как получить аргументы командной строки? $0 — это имя вызванной команды, $1, $2,… это все остальные. Или может быть непонятно как с этими аргументами работать? Ну дык напишите мне примеры использования этой ещё не написанной процедуры. Я могу конечно придумать за вас, но мне лень думать. Скрипт я напишу, если вы опишите подробно что он должен делать и какие параметры командной строки принимать. Но думать я отказываюсь категорически.
В пятницу у меня лабораторные, я точно узнаю.
Преподаватель сказал, что в принципе скрипт который я писала нормальный… но он бы изменил добавление строки в начало… т.е. сначала бы он добавил строку а потом весь документ. Он сказал что хочет видеть меню. как он пояснил… задается вопрос: Хотители вы добавить строку? да или нет… потом Хотите ли вы добавить строку: 1) в начало 2) в конец. Если в ответе я пишу к примеру 2, то он добавляет сразу строку в конец… вот как то так должно быть… как скрипт должен выглядеть?
#!/bin/bash
echo «Хотите ли вы добавить строку?»
read answer
if [ $answer != «да» ]; then
echo «Не хотите, как хотите.»
exit
fi
echo -e «Куда добавлять?\n1) в начало;\n2) в конец»
read answer
if [ $answer == «1» ]; then
echo «строка добавленная в начало» >temp-file.txt
cat file1.txt >>temp-file.txt
mv temp-file.txt file1.txt
elif [ $answer == «2» ]; then
echo «строка добавленная в конец» >>file1.txt
else
echo «$answer?? не понимаю…»
fi
Когда в начало строка дописывается, сначала создаётся временный файл, куда записывается добавляемая строка, затем дописывается содержимое исходного файла (file1.txt), после чего временный файл переименовывается, замещая таким образом старую «версию» исходного файла.
Временный файл имеет название temp-file.txt, это почти всегда рабочий подход, но у fhunter’а лучше, с использованием mktemp.
ps. Запускать не пробовал, писал прямо тут. Если чего не работает, сообщите: выясним в чём косяк.
Я думаю, что нагляднее разбор выбора пользователя делать через case.
Как-то так. Не проверял. Это встроенное средство shell, ничего лишнего.
Да, если выпендриваться и делать действительно меню — есть ещё утилитка dialog, позволяющая сделать именно интерактивное меню в духе установщика slackware. С поддержкой стрелочек и прочими радостями.
Он не работает….( как не пробовала переделывать все равно
он меня спрашивает куда добавлять, я отвечаю, а он мне выводит что не понимает меня
Ответом должна быть 1 или 2. В скрипте нужны кавычки лапочки, а не ёлочки как у меня в комментарии. Если всё так сделать, то должно работать.
нет… все равно не понимает, что ему делать
он просто не распознает цифры… когда вводишь 1 или 2 он вылетает из цикла
Странно и непонятно. Попробуй буквы подставить в скрипт. Может с буквами заработает?
вот что пишет
rghost.ru/41896940
скрипт вроде правильный
rghost.ru/41896985
Пробелы!
Да, кавычки тут вообще можно опустить, поскольку пробелов внутри строки 1 нет, лишь один символ.
все равно
rghost.ru/41898120
либо запускайте скрипт так:
bash test.sh
либо, попробуйте заменить == на =. Тут уже видимо несовместимости bash со стандартным sh лезут.
=**** да ты был прав) теперь заработало) скажи пожалуйста, а можно сделать так, чтоб файл был к примеру не сразу задан в скрипте, а я его название вручную набирала… к примеру, «в какой файл вы хотите добавить строку?»
да, можно.
по аналогии с предыдущим вариантом:
read читает в переменную filename введённое имя файла.
Ключик -e включает использование readline (историю ввода, редактирование, дополнение по tab и прочие мелкие приятности).
По-хорошему, не забудьте проверить, что файл такой вообще есть, перед тем, как с ним что-то делать.
Например утилиткой test:
test -e проверит имя файла на наличие. Кавычки вокруг $filename нужны на случай появления там пробелов
Спасибо огромное) Вы мои спасители) меня даже втянуло все это) очень интересно) =****
с концом и началом можно сделать ещё и так:
Забыл добавить. В вашем примере не хорошо следующее: файл вы открываете целиком в память, что в случае длинного файла будет несколько не быстро (или вообще безуспешно).
mktemp создаёт временные файлы.