motofan logo
26 страниц V « < 18 19 20 21 22 > »         
> 

Написание скриптов #!/bin/sh for UNIX, Кто поможет?

VINRARUS
сообщение 17.6.2011, 17:56 Закрепленное сообщение!


Куратор темы

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

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

Рейтинг: 1211



Ура! В теме появилася шапочка. 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 - 12.12.2020, 21:32
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 30.8.2016, 8:56


Rock The Microphone
********

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


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



Рейтинг: 4609



Цитата(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 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Програмка для отслеживания запущеных програм.
Работает постоянно и без пауз, по этому нагружает ЦП на 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 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Радость то какая! 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 килобайт ) Кол-во скачиваний: 64
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 10.4.2017, 19:55


Куратор темы

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

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

Рейтинг: 1211



Пример того как из под 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 681
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto X Play
Прошивка: Модифицированная...


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



Рейтинг: 620



Когда-то давно написался редактор конфигов... Пока идет допилка одной софтины выложу его отдельно, авось и пригодится кому...
Способ работы с ним:
Обращаемся из приложения примерно так:
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 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(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 681
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto X Play
Прошивка: Модифицированная...


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



Рейтинг: 620



VINRARUS,
Интересная загогулина... Увидел некоторые свои опусы... Но со своей стороны понятнее мой код. Хоть и твой скорее думается на проце...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.10.2017, 19:01


Куратор темы

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

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

Рейтинг: 1211



Отличная статья о том как правильно допускать ошыбки в shell. grin.gif
Также с нее можна узнать на сколько bash отличается от shell. clapping.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 26.10.2017, 13:06


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Цитата(VINRARUS @ Вчера, 20:01)
* узнать на сколько bash отличается от shell

bash от shell ?? может bash от других оболочек, bash это ж тоже shell.

походу ты не знаеш что такое shell и путаеш его c sh или ash.
Цитата(VINRARUS @ Вчера, 21:19)
* Любой код shell пойдет на /bin/bash.

нелюбой, в этом и суть оболочек(допусти pdksh или tcsh оболочка), что у каждой своя специфика, многие вещи в стиле юникса приведены к единой структуре, а некоторые все-равно различаются.

Сообщение отредактировал fill.sa - 4.11.2017, 18:44
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 27.10.2017, 21:03


Куратор темы

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

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

Рейтинг: 1211



bash это shell (частично), но shell это не bash wink.gif
Цитата(fill.sa @ Сегодня, 11:42)
* походу ты не знаеш что такое shell и путаеш его c sh или ash.

Shell это posix совместимый язык програмирования. А sh, ash, bash это интерпритаторы, которые именно shell код должны запускать одинаково.
А вот язык программирования bash, имеющий bashismы (то есть элементы работающие токо в /bin/bash) это уже НЕ shell, а его диалект (проще говоря другой язык). Есть bash оболочка (upd: то есть интерпретатор), а есть bash язык.

Простой пример несовместимости кода bash с sh:
Код
TEST_IQ(){ echo "Wat is 49*24?"
if ! read -t10 A
then
echo "you slowpoke"
elif [ "$A" = "$((49*24))" ]
then
echo "you genius"
else
echo "you stupid"
fi
}
TEST_IQ

Язык bash от shell отличается отдаленно и образно как С++ от С (если я правильно понимаю смысл С++).

Сообщение отредактировал VINRARUS - 8.11.2017, 15:44
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

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

 



Текстовая версия Сейчас: 16.4.2024, 20:38

Форум живёт: