BASH Scripting

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Messi
Сообщения: 3

Re: BASH Scripting

Сообщение Messi »

Здраствуйте, мне нужно сделать несколько заданий по Linux на bash. Некоторые я сделал, но некоторые не могу, помогите пожалуйста, за любую помощь буду очень благодарен)

вот что я не сделал:
1)Напишите сценарий, который выводит пронумерованный список файлов с расширением txt в текущем каталоге, ожидает от пользователя ввода номера файла, выводит первые десять строк заданного файла и повторяет цикл.

2)Встроенная команда интерпретатора read имя считывает строку со стандартного ввода и записывает её в переменную имя. Команда возвращает код завершения ноль если строка была успешно считана и код отличный от нуля если произошла ошибка или встретился конец файла. Напишите сценарий, который считывает строки со стандартного ввода и выводит их на стандартный вывод. (Используйте цикл while).

3)При помощи sed выведите из файла /etc/passwd идентификаторы пользователей и их имена, разделенные символом табуляции, в формате:

0 root
1 daemon
2 operator ...
Вывод должен быть отсортирован по идентификатору пользователя.

4)Напишите сценарий для sed, который будет менять местами каждые две строки файла.
Возможно sed прийдется запускать с ключом -n.

5)Напишите сценарий для редактора sed, который будет добавлять:

a) В начало файла строку "<html><body>".
b) В начало всех строк начинающихся словом "Приступ" строку "<H2>", а в конец строку "</H2>".
с) В конец всех остальных строк "<br>".
d) К концу последней строки "</body></html>"
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: BASH Scripting

Сообщение nesk »

Messi писал(а):
10.05.2008 18:51
Здраствуйте, мне нужно сделать несколько заданий по Linux на bash. Некоторые я сделал, но некоторые не могу, помогите пожалуйста, за любую помощь буду очень благодарен)


Темы от студентов с запросами готовых решений по заданиям зарываются не глядя.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Messi
Сообщения: 3

Re: BASH Scripting

Сообщение Messi »

я не прошу готовый ответ, возможно какая-нибуть подсказка или намек, за который я буду очень благодарен.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

Messi писал(а):
10.05.2008 19:07
я не прошу готовый ответ, возможно какая-нибуть подсказка или намек, за который я буду очень благодарен.

намекаю. прочитайте хотя бы тему в которой вы задали этот вопрос ....
Спасибо сказали:
Messi
Сообщения: 3

Re: BASH Scripting

Сообщение Messi »

diesel писал(а):
10.05.2008 20:48
Messi писал(а):
10.05.2008 19:07
я не прошу готовый ответ, возможно какая-нибуть подсказка или намек, за который я буду очень благодарен.

намекаю. прочитайте хотя бы тему в которой вы задали этот вопрос ....


прочел тему и еще много чего, но не помогло...
Спасибо сказали:
Аватара пользователя
Kataklysm
Сообщения: 280
ОС: Linux Suse 10.2-10.3 Sles-10.1

Re: BASH Scripting

Сообщение Kataklysm »

Messi писал(а):
11.05.2008 00:28
diesel писал(а):
10.05.2008 20:48
Messi писал(а):
10.05.2008 19:07
я не прошу готовый ответ, возможно какая-нибуть подсказка или намек, за который я буду очень благодарен.

намекаю. прочитайте хотя бы тему в которой вы задали этот вопрос ....


прочел тему и еще много чего, но не помогло...


Либо плохо читал, либо не практиковался во время чтения...........
Тут главное понять, как это работает. И поставь перед собой определенную цель, а остальное само получится. :)
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

Messi писал(а):
11.05.2008 00:28
diesel писал(а):
10.05.2008 20:48
Messi писал(а):
10.05.2008 19:07
я не прошу готовый ответ, возможно какая-нибуть подсказка или намек, за который я буду очень благодарен.

намекаю. прочитайте хотя бы тему в которой вы задали этот вопрос ....


прочел тему и еще много чего, но не помогло...


намекаю конкретней: задача:
2)Напишите сценарий, который считывает строки со стандартного ввода и выводит их на стандартный вывод. (Используйте цикл while).


Подсказка номер 0 в условии задачи:
Встроенная команда интерпретатора read имя считывает строку со стандартного ввода и записывает её в переменную имя. Команда возвращает код завершения ноль если строка была успешно считана и код отличный от нуля если произошла ошибка или встретился конец файла.


Подсказка номер раз в моем посте BASH Scripting

фактически test возвращает просто 1 или 0, поэтому вместо test может быть любая операция, ведущая себя аналогично:

ls| while read i; do echo $i; done

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


фактически больше ничего для решения не надо. Если не понятно что-то с стандартным вводом-выводом, можно внимательно изучить первый пост этой темы: BASH Scripting

sed'овые задачки посложнее. возможно стоит обратиться к книге sed and awk (ссылка легко находится гуглом, здесь не привожу, ибо не уверен на 100% в законности выкладывания O'Reilly bookshelf в свободный доступ)
Спасибо сказали:
Аватара пользователя
gabell
Сообщения: 125
ОС: FreeBSD, Archlinux

Re: BASH Scripting

Сообщение gabell »

* разделить команды двумя подряд идущими вертикальными чертами:

Полагаю, что задумывалось

Код: Выделить всё

echo a  || ls

И там дальше еще просмотрите, пожалуйста, листинги кодов.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: BASH Scripting

Сообщение KiWi »

gabell писал(а):
21.06.2008 11:17
* разделить команды двумя подряд идущими вертикальными чертами:

Полагаю, что задумывалось

Код: Выделить всё

echo a  || ls

И там дальше еще просмотрите, пожалуйста, листинги кодов.

Гм, уехало из-за вики-разметки. Поправил.
Спасибо сказали:
Аватара пользователя
feriantoz
Сообщения: 30

Re: BASH Scripting

Сообщение feriantoz »

два вопроса.

При понижении битрейта MP3 через lame не сохранятются id3-теги. Есть ли какой-то простой вариант переноса/копирования тегов? Знаю, что можно отдельно перелопачивать теги (читать - записать) через mp3info, id3, id3v2, но хочется гуманного подхода.

И ещё. Есть какие-то интересные mp3-шки у меня: что это за теги такие, что Гном их читает и выводит в свойствах Аудио (mp3), а консольные id3, id3v2, mp3info выводят пустые поля?
решено: eyeD3
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: BASH Scripting

Сообщение gcc »

была библиотека на perl, там вставлять точно можно было!!!

то есть то что тебе надо, открыть директориюи с каждого файлы и считать те записи в массивы ссылки на хэши , хэши хэшей, или просто сохранить в б.д...

потом занести обрано...
Спасибо сказали:
igramnet
Сообщения: 2
ОС: Linux

Re: BASH Scripting

Сообщение igramnet »

Добрый день. У меня есть вопрос. Моя задача состоит в поиске в архивах rar и zip файл test.txt и удаления его. Вручную это накладно. Вот обратился в Гуглу и получил

Код: Выделить всё

find ./ -iname "*.zip" -exec sh -c "unzip -l \"{}\" | grep test\.txt | awk '{print \$4\" in {}\"}'" \;


Ищет файлы в zip, но не удаляет их. Как сделать чтобы искало и удаляло?

PS Как я понял для RAR надо использоваться unrar. А можно эти запросы объеденить (чтобы и в rar и zip искало одновременно)?

Спасибо.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

igramnet писал(а):
24.06.2008 23:00
Добрый день. У меня есть вопрос. Моя задача состоит в поиске в архивах rar и zip файл test.txt и удаления его. Вручную это накладно. Вот обратился в Гуглу и получил

Код: Выделить всё

find ./ -iname "*.zip" -exec sh -c "unzip -l \"{}\" | grep test\.txt | awk '{print \$4\" in {}\"}'" \;


Ищет файлы в zip, но не удаляет их. Как сделать чтобы искало и удаляло?


а что из этого должно удалять?
Спасибо сказали:
Аватара пользователя
feriantoz
Сообщения: 30

Re: BASH Scripting

Сообщение feriantoz »

надо распаковать, снова найти этот файл, удалить его и запаковать архив. иначе не представляю себе. с кодом сложности, я сам начинающий)
Спасибо сказали:
igramnet
Сообщения: 2
ОС: Linux

Re: BASH Scripting

Сообщение igramnet »

test.txt должен удалять. Может скажете как полностью скрипт написать? Просто очень необходимо.
Спасибо сказали:
Аватара пользователя
feriantoz
Сообщения: 30

Re: BASH Scripting

Сообщение feriantoz »

Интересная вещь. Изменяю переменную $tag_comment в цикле while. Вывожу для теста её прямо в цикле - нормально, поменялась. Вывожу после цикла - значение, которое было ДО цикла О_о

читабельный вариант http://paste.org.ru/?47r73p

Код: Выделить всё

#!/bin/bash
i="02-36_crazyfists-one_more_word-h8me.mp3"
tag_comment="NULL_WORK_JUST_BEGIN!"
tag_descr=""
tag_lang=""
comment_mark_found=false

eyeD3 --no-color "$i" | while read line; do
    echo -e "________________________________\n$line" # текущая строка, которая проходит проверку.
    if  [[ $comment_mark_found == true ]]
    then
        echo "YES!"
        tag_comment=$line
        echo "the string is '$tag_comment'"
    else
        tag_descr=$(echo "$line" | sed -ne "s/Comment: \[Description: \(.*\)\] \[Lang: \(.*\)\].*/\1/p")
        echo "$tag_descr"
        tag_lang=$(echo "$line" | sed -ne "s/Comment: \[Description: \(.*\)\] \[Lang: \(.*\)\].*/\2/p")
        echo "$tag_lang"

        if [[ "$tag_descr" != "" ]] && [[ "$tag_lang" != "" ]] # дошли до строчки comment, следующая строка - сама коммент.
        then
            comment_mark_found=true
            echo "comment has been found"
        fi
    fi
    echo "the string is '$tag_comment'"
done
echo "attention!"
echo "the string is '$tag_comment'" #Почему вывод этого строка, которая была до цикла? Хотя вывод в цикле показал какую-то заоплненную строку

exit 0

#Exampe outlines for `eyeD3 --no-color "$i"`
#02-36_crazyfists-one_more_word-h8me.mp3    [ 5.15 MB ]
#--------------------------------------------------------------------------------
#Time: 3:45    MPEG1, Layer III    [ 192 kb/s @ 44100 Hz - Stereo ]
#--------------------------------------------------------------------------------
#ID3 v1.1:
#title: One More Word        artist: 36 Crazyfists
#album: Bitterness The Star        year: 2002
#track: 2        genre: Metal (id 9)
#Comment: [Description: ID3 v1 Comment] [Lang: eng]
#h8me..as alwayz



Код: Выделить всё

#YES!
#the string is 'h8me..as alwayz'
#the string is 'h8me..as alwayz'
#attention!
#the string is 'NULL_WORK_JUST_BEGIN!'
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

igramnet писал(а):
25.06.2008 20:17
test.txt должен удалять. Может скажете как полностью скрипт написать? Просто очень необходимо.

может быть вам лучше вот с этой опцией поиграться ?

Код: Выделить всё

-d     Remove (delete) entries from a zip archive.  For example:

                     zip -d foo foo/tom/junk foo/harry/\* \*.o

              will  remove  the entry foo/tom/junk, all of the files that start with foo/harry/, and all of the files that end with .o (in any path).  Note
              that shell pathname expansion has been inhibited with backslashes, so that zip can see the asterisks, enabling zip to match on  the  contents
              of the zip archive instead of the contents of the current directory.  You can also use quotes to escape wildcards, as in

                     zip -d foo foo/tom/junk "foo/harry/*" "*.o"

              Under systems where the shell does not expand wildcards, such as MSDOS, the backslashes are not needed.  The above would then be

                     zip -d foo foo/tom/junk foo/harry/* *.o

              Under  MSDOS,  -d is case sensitive when it matches names in the zip archive.  This requires that file names be entered in upper case if they
              were zipped by PKZIP on an MSDOS system.

а потом вставить нужную zip-команду в -exec файндовский. в любом случае - для того чтобы написать вариант с распаковать, удалить, запаковать в этом разделе сказано достаточно(смотрите внимательно мой пост про циклы, и первый пост этого топика + man zip)
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

Привет. А у меня такой вопрос: как в цикле while сделать проверку на ввод нескольких символов сразу? тоесть case'om я выполняю действия по нажатию "Y" || "y" или по нажатию "N" || "n" а весь case поидее надо заключить в while но с проверкой вводимой переменной не на один вариант а, как получается, а на 4 (у меня тока робит while $arg != "y" , а надо что то типа while $arg != {y,Y,n,N} но так не робит.) Отрицание - потому что выполнять запрос и сравнивать его в case с "Y" || "y" или "N" || "n" до тех пор пока не выпадет одна из этих четырех букв. Сходу в гугле не нашел и в ABS guide тоже, там только такое задание как раз есть для практики...
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: BASH Scripting

Сообщение ZyX »

tremor писал(а):
17.07.2008 15:21
Привет. А у меня такой вопрос: как в цикле while сделать проверку на ввод нескольких символов сразу? тоесть case'om я выполняю действия по нажатию "Y" || "y" или по нажатию "N" || "n" а весь case поидее надо заключить в while но с проверкой вводимой переменной не на один вариант а, как получается, а на 4 (у меня тока робит while $arg != "y" , а надо что то типа while $arg != {y,Y,n,N} но так не робит.) Отрицание — потому что выполнять запрос и сравнивать его в case с "Y" || "y" или "N" || "n" до тех пор пока не выпадет одна из этих четырех букв. Сходу в гугле не нашел и в ABS guide тоже, там только такое задание как раз есть для практики…
«! echo "$arg"|grep -i 'y\|n'»?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

для bash(сравнительно не старого):

Код: Выделить всё

diesel@debian:/proc$ i=c; [[ $i =~ "(y|Y|n|N)" ]] && echo OK || echo "not OK";
not OK
diesel@debian:/proc$ i=y; [[ $i =~ "(y|Y|n|N)" ]] && echo OK || echo "not OK";
OK
diesel@debian:/proc$ i=n; [[ $i =~ "(y|Y|n|N)" ]] && echo OK || echo "not OK";
OK


UP: лучше там "^(y|Y|n|N)$"
Спасибо сказали:
tremor
Сообщения: 32

Re: BASH Scripting

Сообщение tremor »

to ZyX: Отлично подошло, спасибо, все оказывается просто )) Экранирование "или" тоже весело само по себе )) Есть правда штука что если ввести аброкадабру с символом "y" или "n" то это посчитается за правильный ответ (например ответ вида "sdoNs" или "ydv") но на всех пользователей не угодишь...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: BASH Scripting

Сообщение diesel »

tremor писал(а):
21.07.2008 08:07
на всех пользователей не угодишь...

легко :) выше уже все написано чтобы "угодить"
Спасибо сказали:
skvitek
Сообщения: 96

Re: BASH Scripting

Сообщение skvitek »

Сделал себе LiveCD: периодически бывает нужно иметь под рукой систему, похожую на домашнюю с доступом в интернет. Если бы япользовался диском один - ладно, всё настроил, сделал образ, записал. Но есть вариант, что такой диск будет не только у меня.
Вот написал скрипт для быстрой настройки интернет соединения, чтобы не тратить время на правку конфигов:
http://pastebin.com/m717ffd36
Пока черновой вариант, но уже вполне рабочий. Вы не могли бы посмотреть и подсказать, что лучше изменить или сделать по-другому.
Или и так сойдёт?

P.S.: С английским у меня никак, так что не смейтесь с комментариев.
nyashka
Спасибо сказали:
LMZ
Сообщения: 25
ОС: debian etch

Re: BASH Scripting

Сообщение LMZ »

пытаюсь показать файлы только двух типов:

find . -name '*\.(ext1|ext2)' -type f -print

не получается. Подскажите в чём ошибка.
Спасибо сказали:
LMZ
Сообщения: 25
ОС: debian etch

Re: BASH Scripting

Сообщение LMZ »

подскажите какой связкой утилит можно выбрать файлы каких то определённых типов.

заранее благодарю.
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Voice »

find . -regextype posix-egrep -regex '.*\.(ext1|ext2)'
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
LMZ
Сообщения: 25
ОС: debian etch

Re: BASH Scripting

Сообщение LMZ »

отлично, спасибо!
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: BASH Scripting

Сообщение ZyX »

diesel писал(а):
23.07.2008 10:34
легко :) выше уже все написано чтобы "угодить"
Можно добиться того же и с grep — «grep -i '^\(y\|n\)$'».
Спасибо сказали:
lexxus
Сообщения: 27
ОС: Linux Ubuntu

Re: BASH Scripting

Сообщение lexxus »

Здравствуйте...

Возникла необходимость создания скрипта для включения и выключения интернета.
Вообще задача такая:

Интернет включается командой pon dsl-provider.
Далее нужно сделать так:
смотрится если есть dsl-provider в процессах, если есть то kill его. - тем самым произойдет отключения интернета.

Объяснение еще проще:
Тыкаем по скрипту - загружается инет.
Тыкаем второй раз по этому скрипту - интернет отключается.

Реализуемо такое вообще?! :)
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

lexxus писал(а):
09.10.2008 13:59
Интернет включается командой pon dsl-provider.
Далее нужно сделать так:
смотрится если есть dsl-provider в процессах, если есть то kill его. - тем самым произойдет отключения интернета.

Сто лет назад родился у меня такой кривой скрипт для генерации меню FVWM:

Код: Выделить всё

   #!/bin/sh

   providers="provider1 provider2"
   current=$(ps -o pid,cmd axw | awk '/^ *[0-9]* *(\/usr\/sbin\/)?pppd call/ {print $4}')

   if [ -n "$current" ]; then
       # Generate disconnect menu
       echo "+ \"Disconnect $current\" Exec sudo poff $current"
   else
       # Generate connect menu
       for provider in $providers; do
           echo "+ \"Connect $provider\" Exec sudo pon $provider"
       done
   fi

Думаю, несложно будет адаптировать под ваши нужды, а лучше, просто позаимствовать идею. Или заглянуть в poff и слямзить оттуда.
Спасибо сказали: