20 страниц V « < 18 19 20        
> Написание скриптов #!/bin/sh for UNIX, Кто поможет?
VINRARUS
сообщение 17.6.2011, 17:56 Закрепленное сообщение!


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Ура! В теме появилася шапочка. watsup.gif
В даной теме помогаем друг другу в написании шелл скриптов, и дружно решаем проблемы связанные с ними smile.gif

Вот мои рукописные мануалы для совсем новичков:
Основы. Синтаксис, кавычки, переменные, условные операторы
Розширенная инфа о if

Мануал основ -_- Эх интернет, интернет, че ж ты такой склерозный?
Подробный мануал с примерами по ВСЕМ функциям SH
Портативная версия еще одного мануала
Книги в формате Djvu

Примеры работы с текстом через sed и мануал PRO и мануал NUB
Примеры работы с текстом через awk и мануал
Обрезка текста внутри переменных - чорт ногу сломит =] О логике шаблонов.

Где быстро найти инфу?
Тут вводите в строчку поиска манов любую утилиту, например echo, и 95% вероятности что получите инфу по всем функциям и ключам
Вот инфа по НЕКОТОРЫМ утилитам, также можна пользоваться поиском

ПС

1. Не во всех UNIX\LINUX системах можно сразу в терминале вводить команды утилит.
Например в MOTOMAGX часто перед командой утилиты нужно вводить "busybox" (например busybox free) хотя это и решено на некоторых модах.
А в некоторых выкидышах типа Android они и вовсе отсутствуют как и сам busybox, но есть возможность добавить его самому.

2. Не всегда утилиты поддерживают то что написано в манах к ним, иногда функционал меняется от версии к версии.

3. Также нужно знать что код от bash иногда может не работать корректно на shell (sh), хотя и очень редко.
Это из за того что древним программистам делать было нечего, когда не было еще интернета, и они понапридумывали кучу модификаций.
Хорошо хоть код под чистый shell подойдет ко всем им, из за чего он считается эталоном. smile.gif
А не bash как считают юные линуксойды.
[close]


Сообщение отредактировал VINRARUS - 19.6.2017, 22:14
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 30.3.2016, 16:45


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Секундомер на SHELL с точностью до 1/10 секунды (ну почти grin.gif ), будет полезен для ознакомления новичкам. pooh_go.gif
Код

MILI(){
N2=0
echo -n "
$N1" &
while [ "$N2" -lt 9 ]
do
usleep 100000
let N2=$N2+1
echo -n " .$N2" &
done
}
N1=0
while true
do
MILI &
sleep 1
let N1=$N1+1
done

Даже такой пустяк не просто заставить правильно работать на маломощных системах (133 МГц это вам не "2ядра+2гига", нужно оптимизировать).
По этому интересно наблюдать как милисекунды не могут догнать целые секунды на 133 МГц. Что бы исправить ставим usleep 77000 или подымаем частоту ЦП.
Нужно понимать что команда sleep внутренняя и исполняется самим SHELL, в то время как usleep запускается через busybox в новом процессе, из за этого и происходит отставание

Сообщение отредактировал VINRARUS - 30.3.2016, 16:49
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 30.8.2016, 7:28


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Shell имеет встроенную команду назначения переменных read, которой я чото не пользовался раньше.
Она способна 1й строчкой заменить 28 строчек кода аналогичных движений. dribble.gif
Код
#новый код
read A0 A1 A2 A3 A4 AA </proc/stat

Она читает файл /proc/stat, разбивает 1ю строчку (типа 1 2 3 4 5 7) по пробелах и записывает в переменные A0 A1 A2 A3 A4 полученые фрагменты, ну а остальное в AA.
старый код для примера
Код
#старый код
a=0
GW=`cat /proc/stat`
for GG in $GW
do
case $a in
1)
A1=$GG
;;
2)
A2=$GG
;;
3)
A3=$GG
;;
4)
A4=$GG
break
;;
5)
break
;;
6)
echo ARRR
;;
esac
let a=$a+1
done
[close]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 30.8.2016, 8:56


Rock The Microphone
*******

Группа: Координаторы
Сообщений: 1 845
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652
Модель телефона: XT894 / XT897
Прошивка: Различные


Настроение:
null



Рейтинг: 4505



Цитата(VINRARUS @ Сегодня, 13:28)
* Она способна 1й строчкой заменить 28 строчек кода аналогичных движений.


В современных языках программирования в качестве такой фичи используется множественное присваивание, e.g. Python:

Код
s = '18 10 0.00 0.01 500 26.18 32.20 586.39'
pm25, pm10, hcho, voc, co2, temp, humidity, summ = s.split(' ')
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 16.9.2016, 11:18


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Програмка для отслеживания запущеных програм.
Работает постоянно и без пауз, по этому нагружает ЦП на 100%, но зато ловит команды не плохо. smile.gif
Не баг но фича: при закрытии процесов вставляется пустая строка.
Код
#!/bin/sh
echo bu VINRARUS 2016
PSN=`ps`
NUM=1
while true
do
PSO="$PSN
"
PSN=`ps`
LIST=`echo "$PSO$PSN" | sort -u | sed -n "/$NUM/,\\${p;}" | sed "/ ps/d"`
echo "$LIST" | sed -e '/ ps $/d' -e "/$NUM /d"
LIS=`echo "$LIST" | awk '{print $1} ' | sort -u -n`
NUM=`echo "$LIS" | sed -e '$!d'`
done

Был бы он раньше - было бы намного проще ковырять прошивки.
ПС: вставляйте busybox туда где нужно вашему моду.

Сообщение отредактировал VINRARUS - 9.11.2016, 1:25
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 20.1.2017, 1:58


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Радость то какая! clapping.gif Выпуск утилиты GNU sed 4.3
Цитата
Спустя почти восемь лет с момента выпуска ветки 4.2 сформирован релиз утилиты GNU sed 4.3, в рамках которой развивается реализация неинтерактивного текстового редактора, обычно применяемого для создания фильтров, модификации текстовых файлов и замены блоков по шаблону.

Ключевым улучшением новой версии является значительное ускорение операций сопоставления по регулярным выражениям, которые теперь выполняются быстрее в 10 раз. Кроме того, по возможности отныне применяется неблокирующий ввод/вывод, что также положительно сказывается на производительности. Из новой функциональности отмечается появление опции "--sandbox", при указании которой блокируется выполнение команд "r", "w" и "e".


Проверено, простейшая замена выполняется в 10 раз быстрее!!!!! dribble.gif
Код
# time /home/sed -n -e s/1/a/g -e s/2/b/g -e s/3/c/g -e s/4/d/g -e s/5/e/g -e s/6/f/g -e s/7/g/g -e s/8/h/g -e s/9/z/g -e s/0/o/g /usr/data_resource/vin/7zip/7z.so
real    0m 1.06s
user    0m 1.05s
sys     0m 0.01s
# time sed -n -e s/1/a/g -e s/2/b/g -e s/3/c/g -e s/4/d/g -e s/5/e/g -e s/6/f/g -e s/7/g/g -e s/8/h/g -e s/9/z/g -e s/0/o/g /usr/data_resource/vin/7zip/7z.so
real    0m 11.47s
user    0m 11.43s
sys     0m 0.02s

Ну в некоторых других задачах прирост в 4 раза, а в исключительных случаях в 80 раз! newconfus.gif
Код

# time /home/sed -n s/[a-z]/0/g /usr/data_resource/vin/7zip/7z.so
real    0m 0.72s
user    0m 0.72s
sys     0m 0.00s  
# time sed -n s/[a-z]/0/g /usr/data_resource/vin/7zip/7z.so    real    0m 3.04s -n s/[a-z]/0/g /usr/data_resource/vin/7zip/7z.so
user    0m 3.03s
sys     0m 0.02s

#

# time /home/sed -n  -e '/./{H;$!d;}' -e 'x;/AAA/!d;' /usr/data_resource/vin/7zip/7z.so
real    0m 0.21s
user    0m 0.21s
sys     0m 0.00s
# time sed -n  -e '/./{H;$!d;}' -e 'x;/AAA/!d;' /usr/data_resource/vin/7zip/7z.so
real    0m 16.79s
user    0m 16.72s
sys     0m 0.03s
#

Бинарник под arm прикрепил.

Сообщение отредактировал VINRARUS - 20.1.2017, 2:17
Прикрепленный файл sed-4.3_arm.zip   ( 176.46 килобайт ) Кол-во скачиваний: 15
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 10.4.2017, 19:55


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Пример того как из под shell можна отлавливать действия натива НАПРЯМУЮ. dribble.gif
Возможности этой штуки огромны в умелых руках, вплоть до отлова клавиш или отлова звонков например. clapping.gif
Код
/usr/SYSqtapp/mediaplayer/mediaplayer -d "/usr/data_resource/videos/pingvin.3gp" | while read out
do
case "$out" in
"end MP_AvPlayer::onPlayFinished")
    echo "Finish"
;;
"exit MP_PlayerImpl::~MP_PlayerImpl")
    echo "EXIT"
;;
"enter MP_AvPlayer::stop()")
    echo "Stop"
;;
esac
done

Просто заменяем echo любой командой (шобы не блокировать натив после тяжолой команды ставим символ &), или заменяем значение перед дужкой лубой строкой из вывода натива.


Качества етого способа:
+работает в реальном времени
+не тратит ресурсы (на грани погрешности)
+не плодит новых процесов (все исполняется в 1м sh)
-нужно запускать натив в обертке
-глушит вывод (хотя можна дописать кому нада: echo "$out")
-переменные переназначеные внутри цыкла не сохраняются после цыкла
-незначительно замедляет натив в обертке (зависит от количества его строк и количества условий внутри цыкла)
-полная заморозка натива пока внутри цыкла выполняется команда (если там длительная команда то и висяк будет все это время)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Programmer-tm(Мотофан.)
сообщение 31.7.2017, 10:28


СуперГуру
*******

Группа: Пользователи
Сообщений: 1 637
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto G4 Plus
Прошивка: Модифицированная...


Настроение:
Делать невозможное возможным...



Рейтинг: 597



Когда-то давно написался редактор конфигов... Пока идет допилка одной софтины выложу его отдельно, авось и пригодится кому...
Способ работы с ним:
Обращаемся из приложения примерно так:
config_mgr.sh /путь/до/конфига/конфиг.cfg [параметр]
Этим мы получем в ответе значение параметра.
config_mgr.sh /путь/до/конфига/конфиг.cfg [параметр] [значение]
Этим мы поменяем значение на заданное...
Внимание!!!
Есть точки значения 0 и 00
0 - забивает пустоту
00 - нолик...
Смотри не перепутай, Кутузов (с)
Вот, собственно и все...
Код

#!/bin/sh

# Programmer-tm (Motofan)
# Просмотрщик и редактор конфигурационного файла программы.

# Имя конфигурационного файла принимаем первым:
conf="$1"
# Вторым идет конкретный параметр в файле конфигурации:
par="$2"
# И третим идет конкретное значение этого параметра (если нам надо его поменять!):
zn="$3"

# Проверим наличие нового значения:
if [ "$zn" = "" ]
then
    # Значения нет:
    zn0=`cat "$conf" | grep "^$par" | sed s/$par=//g`
    # Выведем текущее значение параметра:
    echo "$zn0"
    # Покинем программу...
    exit
else
    # Если же новое значение есть, тогда:
    zn0=`cat "$conf" | grep "^$par" | sed s/$par=//g`
    # Мы спервоначалу сравним его с тем, что уже есть:
    if [ "$zn" = "$zn0" ]
    then
        # Коль они равны, то менять мы ничего не будем...
        echo "1"
        exit
    else
        # Если же новое значение мы задали как ноль, то стираем предыдущее значение и откланиваемся пользователю...
        if [ "$zn" = "0" ]
        then
            X=`sed 's/'$par=$zn0'/'$par='/' "$conf"`
            echo "$X" > "$conf"
            echo "null"
        else
            if [ "$zn" = "00" ]
            then
                X=`sed 's/'$par=$zn0'/'$par=0'/' "$conf"`
                echo "$X" > "$conf"
                echo "zero"
            else
                # Если что-то не срослось, и предыдущих функций не хватило, то просто заменим одно значение на другое...
                X=`sed 's/'$par=$zn0'/'$par=$zn'/' "$conf"`
                echo "$X" > "$conf"
                echo "0"
                exit
            fi
        fi
    fi
fi


Сообщение отредактировал Programmer-tm(Мотофан.) - 31.7.2017, 10:32
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 1.8.2017, 18:02


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 104
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1078



Цитата(Programmer-tm(Мотофан.) @ Вчера, 13:28)
* Внимание!!!
Есть точки значения 0 и 00
0 - забивает пустоту
00 - нолик...
Смотри не перепутай, Кутузов (с)

blind.gif Вот тебе без костылика, и немного точности добавил:
Код
#!/bin/sh

# Programmer-tm (Motofan)
# fix bu VINRARUS

# Просмотрщик и редактор конфигурационного файла программы.

# Имя конфигурационного файла принимаем первым:
conf="$1"
# Вторым идет конкретный параметр в файле конфигурации:
par="$2"
# И третим идет конкретное значение этого параметра (если нам надо его поменять!):
zn="$3"

# Проверим наличие нового значения:
##if [ "$zn" = "" ]
##не, лучше пощитаем количество аргументов, шоб если 3й пустой не пропустить его
if [ "$#" != "3" ]
then
    # Значения нет:
##альтернатива 1 командой (состоящая из 2х действий благодаря ключу -e: удалим все строки которые не начинаются с искомого параметра и в найденом удалим название параметра)+прямой вывод:
    sed -e "/^$par=/!d" -e "s/^$par=//" $conf
    # Покинем программу...
    ##и не просто покинем програму, а покинем програму с кодом завершения сэда
    exit $?
else
    # Если же новое значение есть, тогда:
    ##тоже 1й командой заменим, но оставим знак = перед значением
    zn0=`sed -e "/^$par=/!d" -e "s/^$par//" $conf`
    # Мы спервоначалу сравним его с тем, что уже есть:
    if [ "=$zn" = "$zn0" ]
    then
        # Коль они равны, то менять мы ничего не будем...
        echo "1"
        exit 0
    elif [ -z "$zn0" ]
    then
        ##если переменная $zn0 пустая значит в том файле отсутствует нужный параметр (иначе если б параметр был пустой то у нас бы остался знак = который мы сэдом оставили), пожалуемся:
        echo "EROR: not parametr '$par' in $conf"
        ##закидаем ошыбками:
        exit 1
    else
        ##просто заменим параметр в файле, не взирая на содержымое 3го аргумента (да хоть пустота, хоть 0, хоть 00), работая непосредственно с файлом (благодаря ключу -i):
        sed -i "s/^$par=.*/$par=$zn/" $conf
        ##покинем програму с кодом завершения сэда
        exit $?
    fi
fi


Сообщение отредактировал VINRARUS - 1.8.2017, 18:10
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Programmer-tm(Мотофан.)
сообщение 2.8.2017, 14:23


СуперГуру
*******

Группа: Пользователи
Сообщений: 1 637
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto G4 Plus
Прошивка: Модифицированная...


Настроение:
Делать невозможное возможным...



Рейтинг: 597



VINRARUS,
Интересная загогулина... Увидел некоторые свои опусы... Но со своей стороны понятнее мой код. Хоть и твой скорее думается на проце...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux · Forum
 

20 страниц V « < 18 19 20
Ответ в темуСоздание новой темы
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19.8.2017, 3:45

Форум живёт: