программирование на *sh (bash scripting)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
zrd
Сообщения: 21

программирование на *sh

Сообщение zrd »

Требуется руководство для создания пакетных исполняемых файлов с условным переходом.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: программирование на *sh

Сообщение t.t »

(zrd @ Четверг, 11 Ноября 2004, 13:27) писал(а):для создания пакетных исполняемых файлов с условным переходом
В смысле? Имеется ввиду баш-скриптинг? Если да то.. а поискать? Конкретно, в этом сообщении ссылка.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin

Re: программирование на *sh

Сообщение Bolverk »

По программированию на bash есть много howto. Должны быть и для других шеллов, но если глубоко не копать, то разницы не должно быть особой. Еще вариант - почитать те скрипты, которые у тебя установлены в /bin, /usr/bin, еще где.

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

 grep -HI "^#\!/bin/sh"  /bin/* /usr/bin/* 2>>/dev/null
покажет все шелл-скрипты в /bin и /usr/bin.
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

Спасибо огромное.

В качестве оправдания, что не воспользовался поиском, могу лишь сказать, что в в nix системах я... ну не зря же я в соответствующем разделе создал топик :rolleyes:

Будем разбираться. :thumbsup:
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

Здравствуйте.
Мне необходимо в текстовом файле найти определенную строку, далее, в зависимости от результата нахождения оной следует выполнять или не выполнять (по условному переходу) определенные операции.
Помогите пожалуйста разобраться с grep. Я вроде уже все перечитал, что нашел, но никак не могу понять как пользоваться выходом. Хотелось бы значение выхода передать переменной и потом уже на основании ее значения задавать условие. Если есть какой вариант рациональней, посоветуйте, плз.
В хелпе говорится о стандартых выходах (0-нашел, 1-не нашел, 2-ошибка), но как их использовать там ничего не сказано.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: программирование на *sh

Сообщение t.t »

(zrd @ Четверг, 18 Ноября 2004, 12:07) писал(а):Помогите пожалуйста разобраться с grep. Я вроде уже все перечитал, что нашел, но никак не могу понять как пользоваться выходом. Хотелось бы значение выхода передать переменной и потом уже на основании ее значения задавать условие.
Это не греп, это шелл. Заключите команду в обратные апострофы: $STR=`grep 1 2`
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Skull
Модератор
Сообщения: 2089
ОС: ALT Linux

Re: программирование на *sh

Сообщение Skull »

(zrd @ Четверг, 18 Ноября 2004, 12:07) писал(а):Мне необходимо в текстовом файле найти определенную строку, далее, в зависимости от результата нахождения оной следует выполнять или не выполнять (по условному переходу) определенные операции.

Так как при нахождении grep возвращает строку - это очень просто:

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

if [ `grep 'text' file` ]
then
    echo 'Found'
else
    echo 'Not found'
fi
или же проверять после выполнения grep'а значение переменной $?:

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

grep 'text' file >/dev/null;if [ $? = '0' ];then echo 'Found'; else echo 'Not found';fi
Skull
Спасибо сказали:
Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin

Re: программирование на *sh

Сообщение Bolverk »

Skull
:thumbsup: Только что вышел на $? в man bash, секция PARAMETERS, подсекция Special Parameters. :D
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

Выдает ошибку

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

=: command not found


Вот листинг:

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

#!/bin/bash

$STR = `grep "qwerty qwer" "text.txt"`
echo $STR

if [ "$STR" = 0 ]; then
    echo String is present
else
    echo String is absent
fi

exit 0

Что я не так сделал?
zrd добавил в 18.11.2004 13:11
(Skull @ Четверг, 18 Ноября 2004, 12:35) писал(а):или же проверять после выполнения grep'а значение переменной $?:

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

grep 'text' file >/dev/null;if [ $? = '0' ];then echo 'Found'; else echo 'Not found';fi


Насколько я понимаю, в конструкции

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

grep 'text' file >/dev/null

часть

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

>/dev/null
заменяет ключ -q.
То есть, конструкция служит для подавления вывода в stdout.
Так?
Спасибо сказали:
Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin

Re: программирование на *sh

Сообщение Bolverk »

Не, не, не. t.t перепутал output команды и ее exit status...
Вот наваял по-быстрому, не исключены глупые ошибки в деталях, но идея, думаю, понятна.

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

#!/bin/bash

STR="qwerty"
grep -q $STR text.txt
STATUS=$?

[ $STATUS  -eq 0 ] && echo String is present
[ $STATUS  -eq 1 ] && echo String is absent
[ $STATUS  -eq 2 ] && echo File not found

А man bash все-таки почитай... перед сном... вместо снотворного... :D
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

Получилось!

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

#!/bin/bash

grep -q "qwerty qwer" "text.txt"

if [ $? = '0' ]
then
    echo 'String is present'
else
    echo 'String is absent'
fi

exit 0

В таком виде все замечательно работает.
Всем большущее спасибо :clap:
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: программирование на *sh

Сообщение t.t »

(Bolverk @ Четверг, 18 Ноября 2004, 13:16) писал(а):Не, не, не. t.t перепутал output команды и ее exit status...
Ага, соображаю сейчас плохо.

P.S. А тему закрывать не надо. Вдруг ещё какой смежный вопрос..
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin

Re: программирование на *sh

Сообщение Bolverk »

(zrd @ Четверг, 18 Ноября 2004, 12:37) писал(а):

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

#!/bin/bash

grep -q "qwerty qwer" "text.txt"

if [ $? = '0' ]
then
    echo 'String is present'
else
    echo 'String is absent'


Или файла нет :D Собственно вокруг чего и шeл разговор.

Я то думал тебе что-то более продвинутое надо... Для такого не надо выяснять exit status, просто

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

 if grep -q "qwerty qwer" "text.txt"; then echo 'String is present'; else  echo 'String is absent'; fi
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: программирование на *sh

Сообщение madskull »

(Bolverk @ Четверг, 18 Ноября 2004, 23:22) писал(а):Я то думал тебе что-то более продвинутое надо... Для такого не надо выяснять exit status, просто

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

 if grep -q "qwerty qwer" "text.txt"; then echo 'String is present'; else  echo 'String is absent'; fi



Простите, пожалуйста... :)

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

grep -q "qwerty qwer" "text.txt" && echo 'String is present' || echo 'String is absent'



З.Ы. А я даже и не знал про -q ...
Век живи - век учись, а всё равно дурнем помрешь :)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Bolverk
Бывший модератор
Сообщения: 1571
ОС: Cygwin

Re: программирование на *sh

Сообщение Bolverk »

(madskull @ Четверг, 18 Ноября 2004, 23:06) писал(а):Простите, пожалуйста... :)

За что?
(madskull @ Четверг, 18 Ноября 2004, 23:06) писал(а):З.Ы. А я даже и не знал про -q ...
Век живи - век учись, а всё равно дурнем помрешь :)

Кто бы уж говорил! Вот это я долго не забуду. Очень хороший пример того, что можно сделать на shell!
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: программирование на *sh

Сообщение elide »

кстати, я тоже всегда пишу конструкции типа [ expr ] && {...} || {...} вместо if...then...else
не знаю почему... привычка....
слава роботам!
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

(elide @ Пятница, 19 Ноября 2004, 0:17) писал(а):кстати, я тоже всегда пишу конструкции типа [ expr ] && {...} || {...} вместо if...then...else
не знаю почему... привычка....


А можно попросить растолковать на пальцах? Ну, для этих... как их... для чайников - вот! :)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: программирование на *sh

Сообщение madskull »

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

block1 && block2 || block3

А что тут растолковывать?

После выполнения block1 интерпретатор анализирует код возврата, и если истина (0) то выполняется block2. Если ложь (!=0) - то block2 пропускается и отрабатывается block3.

Причем, внимание.
Если написать block1 || block3 && block2 , то результат будет совсем другим.
Если после block1 будет истина, то, как и ожидается, отработает block2
А если ложь, то отработает block3 и по его (блока 3) коду возврата будет решаться судьба block2.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
zrd
Сообщения: 21

Re: программирование на *sh

Сообщение zrd »

(madskull @ Пятница, 19 Ноября 2004, 12:15) писал(а):

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

block1 && block2 || block3

А что тут растолковывать?..

Так оно действительно гораздо интересней.
Будем осваивать -).
Спасибо!
Спасибо сказали: