BASH Scripting

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

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

Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

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

# Time:  show h:m:s time; Time
Time() {
    date +%H:%M:%S;
    return 0;
}

# Date:  show d.m.yyyy date; Date
Date() {
    date +%d.%m.%Y;
    return 0;
}


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

[guest@station ~]$ Date; Time;
28.02.2009
08:00:57
[guest@station ~]$
Спасибо сказали:
Hast
Сообщения: 23

Re: BASH Scripting

Сообщение Hast »

И чё это, йпт? )) Я ж вроде как мог расписал. Мне нужен точ в точ аналог перловского скрипта которого я привёл. Дату посомтреть я и сам умею. Суть вопроса не в этом, прочитай мой предыдущий пост.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

такое чтоли, или цифры проверять ?

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

[guest@station ~]$ date | cut -d' ' -f4
09:31:53
[guest@station ~]$


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

#!/bin/bash

GETTIME=$(date | cut -d' ' -f4);
if [ -z "$GETTIME" ]; then
    echo "error: no time";
else
    echo "$GETTIME";
fi;

exit 0;
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: BASH Scripting

Сообщение pcodr »

Hast

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

#!/bin/bash

if [[ "`date`" =~ '([0-9]+:[0-9]+:[0-9]+)' ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "ошибка поиска"
fi
remote system type is unix
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

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

#!/bin/bash

GETTIME="$(expr "$(date | cut -d' ' -f4)" : \
    '\([[:digit:]]*:[[:digit:]]*:[[:digit:]]*\)')";
if [ -z "$GETTIME" ]; then
    echo "error: no time";
else
    echo "$GETTIME";
fi;

exit 0;
Спасибо сказали:
Hast
Сообщения: 23

Re: BASH Scripting

Сообщение Hast »

pcodr Спасибо! Именно то что нужно :)
Спасибо сказали:
Аватара пользователя
Admi0n
Сообщения: 183
Статус: Еще один красноглазик

Re: BASH Scripting

Сообщение Admi0n »

Существует ли команда аналогичная kill но которая убивает процесс не по его PID (ID) а по имени?

И еще вопрос можно ли присвоить одной программе определенный ID? что бы после закрытия и открытия программы ID оставался тот-же?

И третий вопросик какой командой в скрипте можно назначить многократное выполнение одного и того же действия? что бы не писать несколько раз одну и туже команду.
AMD Athlon 3200+ 2.Ghz, RAM 1g, I/Video, 80g IDE
Intel Dual-Core E5300 2.6 GHz RAM 4 GB DDR2, NVIDIA GeForce 7600 GS 256 MB, HDD 320 GB IDE
Intel i3 3.4 GHz, RAM 4 GB DDR3, NVIDIA GeForce 220 GT 512 MB, HDD 500 GB SATA2

Блог: http://admi0n.blogspot.com/
Спасибо сказали:
Аватара пользователя
Vasily_Shmelyov
Сообщения: 88
ОС: Ubuntu

Re: BASH Scripting

Сообщение Vasily_Shmelyov »

Для убийства по имени можно использовать killall, а для многократного выполнения команд - циклы (как ни странно) for, while и т.п.
The pessimist says the glass is half empty.
The optimist says the glass is half full.
The engineer says the container is twice as large as it needs to be.
The physicist says the glass is neither. It is completely full, half with water, the other half with air.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

И третий вопросик какой командой в скрипте можно назначить многократное выполнение одного и того же действия?

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

[guest@station ~]$ for I in . . .; do echo one; done;
one
one
one
[guest@station ~]$
Спасибо сказали:
clumsy
Сообщения: 2

Re: BASH Scripting

Сообщение clumsy »

подскажите как мне получить наибольший UID из /etc/passwd?
sort -nr -t ':' +2 /etc/passwd выводит практически всех из файла. вместо nobody у которого UID самый большой.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

подскажите как мне получить наибольший UID из /etc/passwd?


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

sort -t: -k3 -rn /etc/passwd | head -1;
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

Всем добрый день.

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

Я изложу суть своего вопроса:
Есть первый скрипт, вызывающий второй. Второй является дочерним процессом первого. Вопрос: как можно вернуть значение переменной из второго скрипта (дочернего процесса) в первый (родительский процесс)? У меня пока только идея сохранить его в файл во втором скрипте и прочитать его в первом, но по-моему это кривое решение.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: BASH Scripting

Сообщение nesk »

через стандартный вывод
как-нить так:
A=`prog.sh`

в конце prog.sh
сделать
echo $B

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

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: BASH Scripting

Сообщение Portnov »

Тема уже есть. Прикрепляю эту туда.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

nesk писал(а):
29.03.2009 03:24
через стандартный вывод
как-нить так:
A=`prog.sh`

в конце prog.sh
сделать
echo $B

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

Re: BASH Scripting

Сообщение diesel »

savigm писал(а):
29.03.2009 15:24
nesk писал(а):
29.03.2009 03:24
через стандартный вывод
как-нить так:
A=`prog.sh`

в конце prog.sh
сделать
echo $B

Проблема в том, что мне нужно чтобы выдача второго скрипта шла на терминал.

а в чем проблема?

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

diesel@indie:/tmp$ echo '#!/bin/bash
> echo "ururururur"' > script1
diesel@indie:/tmp$ echo '#!/bin/bash
> A=`./script1`
> echo "Sctipt2: $A"' > script2
diesel@indie:/tmp$ chmod +x script1 script2
diesel@indie:/tmp$ ./script2
Sctipt2: ururururur
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

diesel писал(а):
29.03.2009 15:50
а в чем проблема?

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

diesel@indie:/tmp$ echo '#!/bin/bash
> echo "ururururur"' > script1
diesel@indie:/tmp$ echo '#!/bin/bash
> A=`./script1`
> echo "Sctipt2: $A"' > script2
diesel@indie:/tmp$ chmod +x script1 script2
diesel@indie:/tmp$ ./script2
Sctipt2: ururururur


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

Re: BASH Scripting

Сообщение diesel »

savigm писал(а):
29.03.2009 22:41
В принципе вариант, Я тоже до такого додумался, но первый скрипт сначала выводит часть инфомации(для ее получения выполняется немалый код), потом в зависимости от результата выполненной программы выводит свой результат. В варианте выше это будет выводится сразу, что не совсем хорошо.

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

или же ./script1 | while read i .... etc ... с каким-нить обработчиком во втором скрипте, тогда до некоторой степени можно получить тоже "по мере готовности данных".
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

diesel писал(а):
29.03.2009 15:50
а в чем проблема?

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

diesel@indie:/tmp$ echo '#!/bin/bash
> echo "ururururur"' > script1
diesel@indie:/tmp$ echo '#!/bin/bash
> A=`./script1`
> echo "Sctipt2: $A"' > script2
diesel@indie:/tmp$ chmod +x script1 script2
diesel@indie:/tmp$ ./script2
Sctipt2: ururururur


С выдачей проблему решил, но непонятно теперь как анализировать код возврата первого скрипта во втором. Т.е. мне нужно чтобы второй скрипт читал выдачу первого и анализировал код возврата первого.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

savigm
Код возврата последней команды хранится в переменной $?.
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

Rootlexx писал(а):
30.03.2009 18:49
savigm
Код возврата последней команды хранится в переменной $?.

Код команды скрипта 1 или код команды присвоения переменной выдачи скрипта 1?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4458
Статус: GNU generation
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение Rootlexx »

savigm писал(а):
31.03.2009 02:44
код команды присвоения переменной выдачи скрипта 1

Переведите, пожалуйста :wacko: .
После каждой команды в скрипте можно получить её код возврата из переменной $?. Так понятнее?
Пример:

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

[alexey@localhost ~]$ result=$(ls)
[alexey@localhost ~]$ echo $?
0
[alexey@localhost ~]$ result=$(ls bla-bla)
ls: невозможно получить доступ к bla-bla: Нет такого файла или каталога
[alexey@localhost ~]$ echo $?
2
[alexey@localhost ~]$ ls bla-bla
ls: невозможно получить доступ к bla-bla: Нет такого файла или каталога
[alexey@localhost ~]$ echo $?
2
[alexey@localhost ~]$ ls
tmp/  Видео/  Документы/  Загрузки/  Картинки/  Музыка/  Рабочий стол/  Шаблоны/
[alexey@localhost ~]$ echo $?
0
[alexey@localhost ~]$
Спасибо сказали:
Аватара пользователя
savigm
Сообщения: 127
ОС: openSUSE

Re: BASH Scripting

Сообщение savigm »

Rootlexx писал(а):
31.03.2009 13:12
Переведите, пожалуйста :wacko:.

Существует ли код возврата для операции присвоения (var=5, например) или такие команды не имеют кода возврата?
И ещё: подстановка команд типа var=`command` и var=$(command) - это одно и то-же?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

savigm писал(а):
31.03.2009 14:41
Существует ли код возврата для операции присвоения
нет

savigm писал(а):
31.03.2009 14:41
подстановка команд типа var=`command` и var=$(command) - это одно и то-же?
Да, но $() -- более современный способ и допускает вложенность, в отличие от ``.
Спасибо сказали:
Аватара пользователя
Morozeg
Сообщения: 7
ОС: eeebuntu

Re: BASH Scripting

Сообщение Morozeg »

Вопросик: нужно из выводы команды who выцепить время начала работы определённого юзера и посчитать сколько этот юзер работает в системе. Мне бы хотя бы вкратце, чем пользоваться)
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: BASH Scripting

Сообщение pcodr »

Morozeg
Время в секундах можно посчитать примерно так:

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

echo $[$(date +%s)-$(date -d "`who | grep -m 1 root | egrep -o '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+'`" +%s)]


root заменить на пользователя который интересует.
remote system type is unix
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

есть файл от lynx
там есть такие строчки:

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

key 7
key .
key 7
key .
key 7
key .
key 7

как их(и только их) проще всего поменять на

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

key 3
key 4
key .
key 9
key 1
key .
key 1
key 7
key 8
key .
key 2


т.е. найти ip 7.7.7.7 и поменять его на другой IP?

пока делаю так: загружаю файл по строкам в массив, и затем

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

nl=""
k=0
for((j=0; j<n; j++))
do
    key=${a[$j]}
    if [ "$key" = "key 7" -a \( "${a[(($j+1))]}" = "key ." -o "$nl" = "key ." \) ]
    then
        d=${ip_a[$k]}
        ld=${#d}
        for((i=0; i<ld; i++))
        do
            echo "key ${d:$i:1}" >>$script_file
        done
        ((k++))
    else
        echo "$key" >>$script_file
    fi
    nl="$key"
done


как тут sed прикрутить - не смог понять :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: BASH Scripting

Сообщение gcc »

drBatty писал(а):
22.04.2009 00:46
т.е. найти ip 7.7.7.7 и поменять его на другой IP?


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

sed -i~ 's/foo/bar/' [files]

в это по-моиму ищет в строках слова в файле

если нет, то вот

http://uran.donetsk.ua/~students/vt97/b/do...ab7/lab7_pl.txt

ключевая фукнция sub Replace
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

подуплился с седом, как сделать замену в echo -e "one\ntwo" | sed ?, чтобы он среагировал на one\n так и не подобрал (пробовал IFS менять - нифига)

а сделал через занос текста в переменную
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: BASH Scripting

Сообщение pcodr »

подуплился с седом, как сделать замену в echo -e "one\ntwo" | sed ?, чтобы он среагировал на one\n так и не подобрал


Всмысле так?

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

echo -e "one\ntwo" | sed 's/one$/two/'
remote system type is unix
Спасибо сказали: