nixp.ru v3.0

23 октября 2017,
понедельник,
23:42:03 MSK

DevOps с компанией «Флант»
Аватар пользователя Стишок
Стишок написала 11 ноября 2012 года в 14:09 (3227 просмотров) Ведет себя как Ненси; открыла 1 тему в форуме, оставила 12 комментариев на сайте.

Добрый день. Ребят нужна помощь. Я в Linux не разбираюсь хоть и прочитала много книг. А практическое задание к курсовой нужно сдать уже на следующей недели. Если не сложно не помогли бы вы разобраться. Вот задание: Разработка командной процедуры в Unix, позволяющей добавлять строки как в конец, так и в начало заданного файла. Все это с использование языка sh. Вот что я написала:

#!/bin/sh

echo -ne «конец\n»>>file1.txt

OLD=’cat file1.txt

echo -ne «начало\n$OLD>file1.txt

rgo

Ну, по-идее, это почти должно работать. Только в строчке OLD=`cat file1.txt` обратите внимание на используемые кавычки: надо как у меня выделять обратными кавычками, которые можно найти на клавиатуре на клавише которая прямо под Esc, рядом с 1.

 

А насчёт того, чтобы именно процедуру… Не совсем понятно как эта процедура должна выглядеть. Тут надо перечитать всё что препод рассказывал, и найти какой-нибудь пример со словами «командная процедура» за его авторством. Потому как можно, допустим, создать функцию:

function my-proc () {

бла-бла-бла

}

Можно создать скрипт, как у вас, повесить на него бит +x положить куда-нибудь в $PATH и использовать как команду.

Кроме того непонятно как эта командная процедура должна решать вопрос: куда добавлять, в начало или в конец?

 

Стишок

rghost.ru/private/41524664/5cf1917b7b817cf69d962e14691efab8

вот ссылка на задание. преподаватель утверждает что это настолько легко, что он не собирается помогать. Так что вся надежда только на вашу помощь.

rgo

Надо задать вопрос преподу, что он имеет в виду говоря слово «процедура». Как бывший студент, я уверен что будет лучше, не спрашивая препода заглянуть в конспект, там почти наверняка это написано, и спрашивать препода об этом, значит лишний раз демонстрировать игнорирование предмета. Если конспекта нет, значит он есть у одногруппника. Если у одногруппников нет, значит надо идти к одногруппнице-отличнице.

Да, и в чём проблема-то? В том как получить аргументы командной строки? $0 — это имя вызванной команды, $1, $2,… это все остальные. Или может быть непонятно как с этими аргументами работать? Ну дык напишите мне примеры использования этой ещё не написанной процедуры. Я могу конечно придумать за вас, но мне лень думать. Скрипт я напишу, если вы опишите подробно что он должен делать и какие параметры командной строки принимать. Но думать я отказываюсь категорически.

Стишок

В пятницу у меня лабораторные, я точно узнаю.

Стишок

Преподаватель сказал, что в принципе скрипт который я писала нормальный… но он бы изменил добавление строки в начало… т.е. сначала бы он добавил строку а потом весь документ. Он сказал что хочет видеть меню. как он пояснил… задается вопрос: Хотители вы добавить строку? да или нет… потом Хотите ли вы добавить строку: 1) в начало 2) в конец. Если в ответе я пишу к примеру 2, то он добавляет сразу строку в конец… вот как то так должно быть… как скрипт должен выглядеть?

rgo

#!/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. Запускать не пробовал, писал прямо тут. Если чего не работает, сообщите: выясним в чём косяк.

fhunter

Я думаю, что нагляднее разбор выбора пользователя делать через case.

case $answer in
1) echo "строка добавленная в начало" > temp-file.txt
cat file1.txt >> temp-file.txt
;;
2) echo "строка добавленная в конец" >> file1.txt
;;
*) echo "Не понимаю"
;;
esac 


Как-то так. Не проверял. Это встроенное средство shell, ничего лишнего.

fhunter

Да, если выпендриваться и делать действительно меню — есть ещё утилитка dialog, позволяющая сделать именно интерактивное меню в духе установщика slackware. С поддержкой стрелочек и прочими радостями.

Стишок

Он не работает….( как не пробовала переделывать все равно

Стишок

он меня спрашивает куда добавлять, я отвечаю, а он мне выводит что не понимает меня

rgo

Ответом должна быть 1 или 2. В скрипте нужны кавычки лапочки, а не ёлочки как у меня в комментарии. Если всё так сделать, то должно работать.

Стишок

нет… все равно не понимает, что ему делать

 

Стишок

он просто не распознает цифры… когда вводишь 1 или 2 он вылетает из цикла

rgo

Странно и непонятно. Попробуй буквы подставить в скрипт. Может с буквами заработает?

Стишок

вот что пишет

rghost.ru/41896940

Стишок

скрипт вроде правильный

rghost.ru/41896985

rgo

Пробелы!

# так неправильно:
if [$answer == 1]; then
# а вот так правильно: if [ $answer == 1 ]; then


Да, кавычки тут вообще можно опустить, поскольку пробелов внутри строки 1 нет, лишь один символ.

Стишок

все равно

rghost.ru/41898120

 

rgo

либо запускайте скрипт так:

bash test.sh

либо, попробуйте заменить == на =. Тут уже видимо несовместимости bash со стандартным sh лезут.

Стишок

=**** да ты был прав) теперь заработало) скажи пожалуйста, а можно сделать так, чтоб файл был к примеру не сразу задан в скрипте, а я его название вручную набирала… к примеру, «в какой файл вы хотите добавить строку?»

fhunter

да, можно.

по аналогии с предыдущим вариантом:

#!/bin/sh
echo Пожалуйста введите имя файла:
read -e filename
echo Введено имя файла: $filename 


read читает в переменную filename введённое имя файла.

Ключик -e включает использование readline (историю ввода, редактирование, дополнение по tab и прочие мелкие приятности).

По-хорошему, не забудьте проверить, что файл такой вообще есть, перед тем, как с ним что-то делать.

Например утилиткой test:

if test -e "$filename" ;then
 #напишите здесь всё доброе и вечное, что вы будете делать с файлом.
fi


test -e проверит имя файла на наличие. Кавычки вокруг $filename нужны на случай появления там пробелов

 

Стишок

Спасибо огромное) Вы мои спасители) меня даже втянуло все это) очень интересно) =****

fhunter

с концом и началом можно сделать ещё и так:

#!/bin/sh
echo "конец" >> file1.txt
NAME=`mktemp` #создаём временный файл echo "начало"|cat - file1.txt > $NAME #нет ограничения на длину файла mv $NAME file1.txt #mv атомарно. rm $NAME #уберём за собой
fhunter

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

mktemp создаёт временные файлы.