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

Написание скриптов #!/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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 28.9.2014, 20:29


Куратор темы

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

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

Рейтинг: 1211



Ну вот, очередное преимущество shell перед bash. blind.gif
В командной оболочке Bash найдена серьёзная уязвимость
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 15.3.2015, 0:06


Куратор темы

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

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

Рейтинг: 1211



Написал вот програмку для сравнения времени жизни заряда акумуляторов. smile.gif
Она состоит из линейного стрес-теста и минутомера который каждую минуту отщитывает в файл "Batlog_?.txt", который появится возле запускаемого скрипта.
Использование:
1) полностью зарядить телефон и отключить от зарядки
2) положить в удобное место скрипт и запустить
3) выбрать режим ЦП для сравнения (обычно это максимальный 532)
4) положить телефон на пол посредине комнаты, обнести колючей проволокой и не трогать пока он сам не вырубится от севшей батарейки
5) после включения читаем файл возле скрипта типа "Batlog_?.txt", в нем видим сколько минут протянула батарея при нагрузке и на какой частоте ЦП

Также там есть режим LOGx, он запускает лишь минутомер, без стресс-теста. Можна запустить его и пользоваться обычными функциями телефона. Предназначен для просмотра статистики времени жизни батареи при активном использовании (он не будет считать то время которое телефон бездействует).

Моя Galilio 1100 мАч выдала такие результаты:
минуты (частота ЦП)
418 (399 MHz)
185 (532 MHz)
139 (740 MHz)

Сообщение отредактировал VINRARUS - 13.9.2016, 15:01
Прикрепленный файл BAT_KILLER.zip   ( 1.02 килобайт ) Кол-во скачиваний: 98
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 2.10.2015, 13:34


Куратор темы

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

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

Рейтинг: 1211



Вот вам написанный мною бенчмарк проверки реальной скорости записи на флешку, это оказалось намного сложнее чем я думал. wacko.gif
Код
echo > '/mmc/mmca1/bu_VINRARUS.tmp';sync; echo -n 'Write speed: ';time sh -c 'dd if=/dev/zero of=/mmc/mmca1/bu_VINRARUS.tmp bs=5M count=1; sync'  2>&1 | sed -e '/real/!d' -e 's/.*m /5120 /' -e 's/s/ \/ p/' | dc | sed 's/\..*/ kB\/s/';rm -f /mmc/mmca1/bu_VINRARUS.tmp


Добавлено позже (2.10.2015, 17:02):
А вот тест скорости чтения с диска (флешки). И тут совсем все плохо в Linux. blind.gif Если бы не сторонний софт то реальная проверка скорости чтения была бы невозможна, так как при чтении или записи любого файла в Linux он остается в оперативной памяти, а там уж скорости космические.
Код
sync; echo -n 'Read speed : ';hdparm -t /dev/mmca 2>&1 | sed -e '/disk reads/!d' -e 's/.* = //'
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 2.10.2015, 20:41


Куратор темы

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

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

Рейтинг: 1211



Вот за 5 минут накидал гуй для него на самом телефоне. Теперь можно сразу с Linux телефонa запускать. smile.gif
Прикрепленное изображение
Требует наличия busybox_full.

Сообщение отредактировал VINRARUS - 2.10.2015, 21:48
Прикрепленный файл zBenchMMC.zip   ( 531 байт ) Кол-во скачиваний: 81
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.10.2015, 22:27


Куратор темы

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

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

Рейтинг: 1211



Еще более глубокая инфа о регулярных выражениях sed.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 21.11.2015, 16:22


Куратор темы

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

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

Рейтинг: 1211



crazy.gif Люди, при обработке чужого текста (написанного в винде) не забывайте избавляться от символа возврата каретки:
Код
tr -d '\r'

А то я немножко повеселился с ней только что. laugh.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 24.2.2016, 2:20


Куратор темы

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

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

Рейтинг: 1211



Проблема в цикле for:
Код

LIST="1111
22222222
33 3
44444444"

for ONO in `echo "$LIST"`
do
echo $ONO
done

что такое цикл for?

Этот механизм в 1 переменную по очереди подставляет значения из списка.
for имя_переменной in список_значений_через_пробел_или_перенос
do
действие с имя_переменной
done
[close]

Костыль для цикла for, шоб он не ломал строчки по пробелах, а токо по переносах:
Код

LIST="1111
22222222
333 3
44444444"

IFSbak="$IFS"
IFS="
"
for ONO in `echo "$LIST"`
do
echo $ONO
done
IFS="$IFSbak"


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


Куратор темы

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

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

Рейтинг: 1211



Код
AUTOSIZE(){
#SIZE_EXTRACTOR 1.2
#2147483647k max
zSIZE=$1
if [ "$zSIZE" -lt 1024 ]
then
let zSIZE=1024+$zSIZE
fi
let zSIZE=$zSIZE*10000/1024
zSIZEM=${zSIZE%%?}
zSIZEK=${zSIZE#$zSIZEM}
if [ "$zSIZEK" -gt 9000 ]
then
let zSIZEM=$zSIZEM+1
zSIZEK=0
elif [ "${zSIZEK##?}" != 000 ]
then
let zSIZEK=${zSIZEK%%???}+1
else
zSIZEK=${zSIZEK%%???}
fi
if [ "$1" -lt 1024 ]
then
let zSIZEM=$zSIZEM-1
fi
zSIZE="$zSIZEM.$zSIZEK"
echo "$zSIZE"
}

Интересную функцию вот написал - она перетворяет килобайты в мегабайты и округливает до десятых в большую сторону.
А то в SHELL округлить в меньшую сторону запросто, а в большую пришлось потрудиться (к тому же когда в 1 МБ 1024 Кб. smile.gif
Код
AUTOSIZE 12345
12.1

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


Куратор темы

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

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

Рейтинг: 1211



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

Рейтинг: 1211



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]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

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

 



Текстовая версия Сейчас: 23.4.2024, 18:15

Форум живёт: