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


Куратор темы

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

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

Рейтинг: 1095



Ура! В теме появилася шапочка. 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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 18.11.2018, 11:13


Гуру
******

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

Рейтинг: 290



Цитата(VINRARUS @ Сегодня, 11:22)
* while

А рзаве циклы не тяжеловесные задачи?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.11.2018, 14:59


Куратор темы

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

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

Рейтинг: 1095



Цитата(fill.sa @ Сегодня, 14:13)
* А рзаве циклы не тяжеловесные задачи?

Кажутся тяжолыми при вызове внешних команд внутри цыкла без интервалов. В даном случае цыкл срабатывает определенное количество раз и отработает быстрее чем запустится некоторый натив, особенно без порождения нового процеса.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.12.2018, 21:05


Куратор темы

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

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

Рейтинг: 1095



Ещо один пример оптимизации shell кода при котором можна ускорить обработку простых условий почти на порядок. thumbup.gif
Для этого достаточно вместо if использовать конструкцию case. Хотя обе команды внутренние и сильно отличаются по функционалу тем не менее для простых условий типа "если N=1 то єто, если N=2 значит то, а если шото другое то хз" case будет не токо быстрее, но и удобнее.

Вот можете сравнить время выполнения аналогичных зацыкленых условий.
IF
Код
N=
read UP1 < /proc/uptime
while true
do
if [ "$N" = "" ]
then
N=1
elif [ "$N" = "a" ]
then
echo re
elif [ "$N" = "b" ]
then
echo re
elif [ "$N" = "c" ]
then
echo re
elif [ "$N" = "d" ]
then
echo re
elif [ "$N" = "e" ]
then
echo re
elif [ "$N" = "f" ]
then
echo re
elif [ "$N" = "g" ]
then
echo repo
elif [ "$N" = "h" ]
then
echo re
elif [ "$N" = "i" ]
then
echo re
elif [ "$N" = "1000000" ]
then
echo END
break
else
N=$((N+1))
fi
done
read UP2 < /proc/uptime
echo "$((${UP2%%.*}-${UP1%%.*})) sec"
[close]

CASE
Код
N=
read UP1 < /proc/uptime
while true
do
case "$N" in
"")
N=1
;;
a)
echo re
;;
b)
echo re
;;
c)
echo re
;;
d)
echo re
;;
e)
echo re
;;
f)
echo re
;;
g)
echo re
;;
h)
echo redi
;;
i)
echo re
;;
1000000)
echo re
echo END
break
;;
*)
N=$((N+1))
;;
esac
done
read UP2 < /proc/uptime
echo "$((${UP2%%.*}-${UP1%%.*})) sec"
[close]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 26.1.2019, 23:10


Гуру
******

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

Рейтинг: 290



VINRARUS,
подключайся к процессу.
Вообщем давно было интересно чем же отличаются между собой прошивки да и прошивки для рахных телов в целом. И я уже как-то выкладывал сравнение между разными файлами.

Теперь, как EXL выложил способ разасэмбливать elf файлы, можно заглянуть и внутрь файлов и посмотреть какие новые функции или методы появились на новых прошах(особенно у ZN5_7FR).

Конечноже по одному файлу смотреть не будешь и нужно все автомотизировать. Пока на ум приходит такая вот карусель
Код
find  -type f  -exec sh -c 'mkdir -p /sdk_my/`dirname $@`; readelf -W -s $@ | awk '{ if( $2 ) print $8 "\t\t // " $4 "bind:" $5}' | c++filt > /sdk_my/`dirname $@`/`basename $@`' sh {} \;

Но есть проблемы с экранированием и ругается на awk '{ if( $2 ), без этого в целом все работает.
Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.
И третье, это отсеивать ссылки, а то будет много повторов техже самых библиотек.

Сообщение отредактировал fill.sa - 26.1.2019, 23:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 31.1.2019, 3:13


Rock The Microphone
*******

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


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







Цитата(fill.sa @ 27.1.2019, 6:10)
* Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.


Попробуй что-нибудь из:

Код
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46
find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF
find $WHERE -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 3.2.2019, 23:10


Куратор темы

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

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

Рейтинг: 1095



Цитата(fill.sa @ 27.1.2019, 2:10) *

Теперь, как EXL выложил способ разасэмбливать elf файлы, можно заглянуть и внутрь файлов и посмотреть какие новые функции или методы появились на новых прошах(особенно у ZN5_7FR).
Конечноже по одному файлу смотреть не будешь и нужно все автомотизировать. Пока на ум приходит такая вот карусель
Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.
И третье, это отсеивать ссылки, а то будет много повторов техже самых библиотек.

Извиняюсь за паузу, был сильно занят. blind.gif
Вот, переходим в папку в которой нада пересмотреть файлы, выполняем скрипт:
Код
#!/bin/sh
#bu_VINRARUS 2019
SPASE="#"
DIRKA=
LOGS="$PWD/../FIND_in_${PWD##*/}"
mkdir "$LOGS"
FINDER(){
    Z=
    echo "in: $PWD"
    for Z in *
    do
    if [ -h "$Z" ]
    then
        echo "ignore link: $Z"
    elif [ -d "$Z" ]
    then
        DIRKA="$DIRKA$SPASE$Z"
        cd "$Z"
        FINDER
        cd ..
        DIRKA="${DIRKA%$SPASE*}"
    elif [ -f "$Z" ]
    then
        DO
    fi
    done
}
DO(){
    echo "read: $Z"
    READ=`readelf -W -s "$Z"`
    if [ "$?" = "0" ]
    then
        echo "$READ" > "$LOGS/$DIRKA$SPASE$Z.log"
    fi
}
FINDER

В папке на уровень выше создаётся папка "FIND_in_(имя папки)" со всеми удачными чтениями команды readelf во всех настоящих подпапках и файлах.
Имя этих файлов содержыт относительный путь шо очень удобно для сравнения в лоб разных версий прошывок в автоматическом режыме (банально контрольной сумой проверяем одинаковые ли файлы, если разные то сравниваем построчно, или какая там суть читающего эльфийца).

Добавлено позже (4.2.2019, 2:15):
Другими словами тут аналог find на шеле, со всеми возможностями шела, а главное с контролируемой логикой. dribble.gif
И нечего страдать головой, грипом или айкать борясь с ветром. grin.gif

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

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

 



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

Форум живёт: