motofan logo
7 страниц V « < 3 4 5 6 7 >        
> 

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


Мотофан
*******

Группа: Почётные мотофаны
Сообщений: 1 818
Регистрация: 3.7.2009
Из: Niko City, Ukraine
Пользователь №: 202 229
Модель телефона: Motorola Razr Maxx HD
Прошивка: CM
Финалист Конкурса 2010


Настроение:




Рейтинг: 1118.5



igoripp, посмотри скрипт запуска зРокБокса от Зорге.Р, там надеюсь найдёшь ответ на свой вопрос!
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
igoripp
сообщение 22.10.2011, 16:50


Самый дерзкий
******

Группа: Пользователи
Сообщений: 1 412
Регистрация: 27.3.2010
Из: Касимов, Муром
Пользователь №: 215 540
Модель телефона: sony ion
Прошивка: Разные

Рейтинг: 1336



K()t,
хорошо, так и сделаю smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
K()t
сообщение 25.10.2011, 7:59


Мотофан
*******

Группа: Почётные мотофаны
Сообщений: 1 818
Регистрация: 3.7.2009
Из: Niko City, Ukraine
Пользователь №: 202 229
Модель телефона: Motorola Razr Maxx HD
Прошивка: CM
Финалист Конкурса 2010


Настроение:




Рейтинг: 1118.5



Вот мой маленький скрипт
Код

#!/bin/sh
mypath=${0%/*}
rm $mypath/netexec.ini
echo -ne "[NetExecConfig]
Command = $mypath/java.sh" > $mypath/netexec.ini
touch "$mypath/netexec.fxd"
wget -0 "http://www.m.opera.com/dl/0qdsNLqfeWrB58jk8zUAXXdCDw8DZGVmYXVsdF8yMDA5LnBuZw==/mini.jar" "$mypath/mini.jar"
find /mmc/mmca1/.system -name mini.jar > $mypath/result.txt
b=`cat $mypath/result.txt`
showQ "Опера найдена!" "пути к установленым ява
$b" 2
cp -f $mypath/mini.jar $b
rm -f $mypath/result.txt
showQ "Замена завершена" " 8)" 2

Что не работает:
1)не хочет скачивать ничего с инета
2)как реализовать замену mini.jar если их больше чем два?
ps.gif писал на паре
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.10.2011, 8:11


Куратор темы

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

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

Рейтинг: 1211



K()t, нада: wget "адрес" -0 "куда"
Код
#!/bin/sh
mypath=${0%/*}
rm $mypath/netexec.ini
echo -ne "[NetExecConfig]
Command = $mypath/java.sh" > $mypath/netexec.ini
touch "$mypath/netexec.fxd"
wget "http://www.m.opera.com/dl/0qdsNLqfeWrB58jk8zUAXXdCDw8DZGVmYXVsdF8yMDA5LnBuZw==/mini.jar" -0 "$mypath/mini.jar"
find /mmc/mmca1/.system -name mini.jar > $mypath/result.txt
b=`cat $mypath/result.txt`
showQ "Опера найдена!" "пути к установленым ява
$b" 2
for MOZG in $b
do
cp -f $mypath/mini.jar $MOZG
done
rm -f $mypath/result.txt
showQ " 8)" "Замена завершена" 2


Сообщение отредактировал VINRARUS - 25.10.2011, 12:46
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
K()t
сообщение 25.10.2011, 11:04


Мотофан
*******

Группа: Почётные мотофаны
Сообщений: 1 818
Регистрация: 3.7.2009
Из: Niko City, Ukraine
Пользователь №: 202 229
Модель телефона: Motorola Razr Maxx HD
Прошивка: CM
Финалист Конкурса 2010


Настроение:




Рейтинг: 1118.5



Не работает скрипт не хочет копировать указанный файл в найденные папки
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.10.2011, 12:45


Куратор темы

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

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

Рейтинг: 1211



K()t,
Я немного код поправил, тот что выше, кавычки убрал, попробуй.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.12.2011, 19:26


Куратор темы

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

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

Рейтинг: 1211



Так как я в системе мода Project Evolution 4 очень часто использую скрипты, а не натив, то понял что для чтения параметров с различных конфигов не удобно их читать скриптам с конфигов типа:
Код
vAvariyka=1
vApmd = 2
vCpufreq = 0
vCache = 100
vBTrof = 1
vBTtimer = 1

Ведь это нада обрабатывать этот файл сторонними утилитами которые тратят и процесорное время и силы при написании кода скрипта, чтения с таких конфигов скорее подходят для натива.
Но можна использовать возможности sh на полную, используя конфиг который подгружает все параметры в готовые переменные мгновенно dribble.gif .
Просто нада гдето (например в /vin/vin.sh) сохранить скрипт с набором переменных (они же параметры) подобного содержимого:
Код
#!/bin/sh
LD_PRELOAD=
CFGPATH=/vin/vin.sh
vAvariyka=1
vApmd=2
vCpufreq=0
vCache=100
vBTrof=1
vBTtimer=1
vBTsms=5

и подгружать их в нужном скрипте таким способом (прописывая эту строчку в начале скрипта):
Код
. /vin/vin.sh


ну менять параметры конечно тяжелее, чем читать их, но это не так часто требуеться. Для этого я например написал специальную утилитку для изменения параметров на SH.
rtfm.gif ___________________________________________________________

И ещё очень часто нужно те или иные файлы монтировать туда - сюда, а постоянно это делать (даже автоматически) не очень удобно и по мнению некоторых людей это плохо влияет на систему. По этому я использую в моде симлинки в замен монтирования. Файл из как правило RO fs заменяю на симлинк который ведет в папку в которой можна перезаписывать инфу. Ну и в этой папке другой симлинк ведет уже на нужный обьект. И если нужно изменить настройку (тоесть обьект на который ведет симлинк) всего лишъ нужно нужно удалить и опять создать симлинк с нужным путем.
Ну и так настройка меняется раз и на всегда, и не нужно выполнять лишних действий при загрузке системы, и легко можно узнать какая установка используется (с помощью readlink). Для смены настроечных симлинков я тоже написал утилитку на SH. smile.gif

Надеюсь кому то пригодится him.gif

Сообщение отредактировал VINRARUS - 9.12.2011, 19:29
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 15.12.2011, 12:17


Куратор темы

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

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

Рейтинг: 1211



Сообщение перенесено сюда: zSHapmd
Так как это является отдельной програмкой, и мало чем относится к названию данной темы, то решил создать отдельную темку, и выложить туда новую 6ю версию zSHapmd. smile.gif
надеюсь никого не обидел этим)))

Сообщение отредактировал VINRARUS - 16.12.2011, 1:25
Прикрепленный файл zSHapmd.7z   ( 833 байт ) Кол-во скачиваний: 71
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
igoripp
сообщение 29.12.2011, 8:09


Самый дерзкий
******

Группа: Пользователи
Сообщений: 1 412
Регистрация: 27.3.2010
Из: Касимов, Муром
Пользователь №: 215 540
Модель телефона: sony ion
Прошивка: Разные

Рейтинг: 1336



Собственно вопрос, есть ли у кого книги на русском по QT версии 4.* и выше? Для мобильный устройств если можно, хочу на новогодних каникулах подучить...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DDA-E398
сообщение 20.10.2012, 18:55


Ветеран
*****

Группа: Пользователи
Сообщений: 372
Регистрация: 12.3.2008
Из: Нижегородская обл.
Пользователь №: 166 356
Модель телефона: E2, A910, Е398, ATRIX2
Прошивка: разные


Настроение:
Роботаю...



Рейтинг: 340



Собсно, провёл небольшое исследование зависимости времени выполнения скриптов от того в каком шелле они выполняются.
Выбор на наших фонах невелик, из всех известных шеллов доступны Bash и Ash (он же Sh).
На днях с помощью великого русского мата всётаки удалось скомпилить bash 4.2.37 (до этого был bash 4.1). И захотелось мне сравнить быстродействие оболочек (Bash 4.2, Bash 4.1 и Sh). Во время поиска помощи по компиляции баша наткнулся на скриптик для проверки скорости работы шеллов:
Код

for i in `seq 1 10000`;do
    echo -n "*ice"
done

Тестить вслепую нехотел, а комп невсегда коннектится с телом по телнэту, поэтому пришлось тестить в двух терминалах которые есть на телефоне: EzxTerm и Konzr. Тут же сделал первое открытие: Konzr быстрее EzxTerm более чем в три раза и не дохнет после 10-15 запуска тестового скрипта.
Но в обоих проявилась чёткая зависимость скорости выполнения тестового скрипта от того какой шелл его выполняет.
Сегодня, от нефиг делать, игрался с параметрами скрипта, выполнял его во всех трёх оболочках трёх оболочках в произвольном порядке (для чистоты эксперимента) и записывал результаты.
Все тесты проводились на Motorola ROKR E2 (624MHz, 128MB Swap, mUbuntu 2.x)
После недолгих подсчётов вывел формулы зависимости времени:

Для Bash 4.1
Код

bash = sh*2 + sh/5
sh = bash*5/11


Для Bash 4.2
Код

bash = sh*2 + sh/10
sh = bash*10/21


Для тех кто в танке поясню:
Как и следовало ожидать Sh быстрее Bash, причём чем тяжелее скрипт, тем быстрее он его выполняет.
(Например если Sh выполняет скрипт за минуту, то Bash версии 4.1 сделает его, примерно за 2 минуты 12 секунд, а Bash 4.2, чуть быстрее, за 2 минуты 6 секунд).

Также решил протестировать скрипт добавив параметр LD_PRELOAD=
Тут ситуация немного иная, т.е. для Bash даёт прирост скорости в 1.5 секунды (+/- 0.5 секунды), независимо от версии Bash, а для Sh - 1 секунду (+/- 0.5 секунды).
Соответственно к предыдущим формулам добавится:

Код

bash = bash - 1.5
sh = sh - 1


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

Быть может попробую скомпилить Zsh, пишут что это чемпион по скорости среди шеллов, но никак не могу найти точную информацию об отличии его синтаксиса от синтаксиса Bash и Sh. Мож кто из мотофанов просвятит?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Zorge.R
сообщение 16.1.2013, 19:59


Ветеран
Group Icon

Группа: System Administrators
Сообщений: 1 915
Регистрация: 4.10.2006
Из: рук в руки
Пользователь №: 101 800
Модель телефона: Note 9 Copper 512Gb
Прошивка: 1CR

Рейтинг: 2510



Залил из старого, что нашел, на github:

https://github.com/ZorgeR/repoZITO
https://github.com/ZorgeR/zMenuBKG
https://github.com/ZorgeR/zSecret
https://github.com/ZorgeR/zPart-ZN5
https://github.com/ZorgeR/zPart (E8)
https://github.com/ZorgeR/zRadio
https://github.com/ZorgeR/zroot
https://github.com/ZorgeR/zMount
https://github.com/ZorgeR/zArchyMan
https://github.com/ZorgeR/zTweet

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


Куратор темы

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

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

Рейтинг: 1211



Отслеживать частоту ЦП с телнета в реальном времени:
Код
while true
do
sleep 1
cat /sys/mpm/op
done


Сообщение отредактировал VINRARUS - 30.3.2013, 18:32
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 11.5.2013, 19:20


Куратор темы

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

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

Рейтинг: 1211



Обрезка строк (переменных) исключительно силами SH.
Источник

Shell позволяет делать простейшее обрезание переменных до (или после) какого то символа. rabbi.gif
Существуют сторонние команды-аналоги типо cut, sed, grep и т.д., но они будут дольше срабатывать (хотя и имеют куда больший функционал).
Но я рекомендую использовать обрезание именно с помощью Shell, так как оно намного быстрее происходит. good.gif

Дальше я буду разбирать пример только при работе с 1 строчным значением переменной.

Оно имеет такой синтаксис состоящий из 3х частей:
${ПЕРЕМЕННАЯопцияШАБЛОН}

Есть 4 наиболее полезные опции обрезания:
# -удаление самого короткого совпадения с шаблоном в начале строки
## -удаление самого длинного совпадения с шаблоном в начале строки
% -удаление самого короткого совпадения с шаблоном в конце строки
%% -удаление самого длинного совпадения с шаблоном в конце строки

А вот символы шаблонов:
? -любой 1 символ
* -любое количество любых символов (может даже соответствовать 0 символам)
\ -экранирование символов \? или \*


Полезнее всего это при работе с путями к файлу или папке.
Разные примеры при обрезании пути к файлу
Для начала запишем в переменную путь к нужному файлу (или папке), прошу заметить что в начале нету символа "/":
Код
OBREZ="mmc/mmca1/mp3/SuperBass/Bass.mp3"


Если нужно отрезать любое название файла (или любые символы после последнего / включительно), получится mmc/mmca1/mp3/SuperBass
Код
${OBREZ%/*}


Но если использовать %%, то останется только mmc (отрежет всё после первого / включительно)
Код
${OBREZ%%/*}


Такая конструкция отрежет 2 раза с права, и получится mmc/mmca1/mp3
Код
${OBREZ%/*/*}


Отрезать с права начиная словом "/mp3", выйдет mmc/mmca1
Код
${OBREZ%/mp3*}


Отрезать начиная словом mp3 c права, выйдет mmc/mmca1/mp3/SuperBass/Bass.
Код
${OBREZ%mp3*}


Отрезать с права начиная словом mp3 самым левым, выйдет mmc/mmca1/mp3/SuperBass/Bas
Код
${OBREZ%%mp3*}


Отрезать 5 символов с права, выйдет mca1/mp3/SuperBass/Bass.mp3
должно быть 5 знаков "?" подряд, просто движок форума убирает их
Код
${OBREZ%?}


Отрезать по самый первый символ / с лева, выйдет mmca1/mp3/SuperBass/Bass.mp3
Код
${OBREZ#*/}


Отрезать по самый последний символ / с лева, выйдет Bass.mp3
Код
${OBREZ##*/}


Отрезать 5 символов с лева, выйдет mca1/mp3/SuperBass/Bass.mp3
должно быть 5 знаков "?" подряд, просто движок форума убирает их
Код
${OBREZ#?}

[close]
Обрезание обычного предложения

Для начала запишем в переменную любое предложение:
Код
OBREZ="MOTOMAGX is super Linux OS"


Результат получите сами Изображение
Код
${OBREZ#*is}

Код
${OBREZ%% *}

Код
${OBREZ#* s}

Код
${OBREZ#*s}

[close]
Практическое применение

Как известно в переменной $0 хранится путь к самому скрипту который работает в данный момент (короче к самому себе).
Это выведет путь к папке, в которой находится этот скрипт, обзываемый обычно mypatch
Код
${0%/*}


Имя нашего скрипта
Код
${0##*/}


Расширение нашего скрипта
Код
${0##*.}


mypatch на уровень в верх
Код
${0%/*/*}


dribble.gif Ну и вот такой механизм я использовал в Shell Player 2.0 , при выборе файла из ФМ предлагает какую папку сканировать
($1 означает например "/mmc/mmca1/MP3/Xclusive Drum & Bass (3CD) (2007)/cd3/02 - G Dub - Les Miserables.mp3"):
Код
DIRA="${1%/*}"
DIRA1="${1%/*}"
DIRA2="${1%/*/*}"
DIRA3="${1%/*/*/*}"
DIRA4="${1%/*/*/*/*}"
DIRA5="${1%/*/*/*/*/*}"

showRadio "SHELL player" "Выберите папку для сканирования:
$DIRA" "/${DIRA1##*/}" "/${DIRA2##*/}" "/${DIRA3##*/}" "/${DIRA4##*/}" "/${DIRA5##*/}"

[close]


blind.gif И помните, обрезание внутри переменной не изменяет значение самой переменной (то есть нужно каждый раз использовать обрезающую конструкцию), для перезаписи переменной используйте такую штуку:
Код
OBREZ="${OBREZ##*/}"


Сообщение отредактировал VINRARUS - 11.5.2013, 20:19
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 19.6.2013, 18:36


Куратор темы

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

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

Рейтинг: 1211



На основе zSHapmd v8 сделал утилиту которая в терминале выводит частоту и процент загрузки CPU.
Постарался сделать что бы ее работа не особо влияла на показатели (общет совершается после снятия показателей).

По умолчанию интервал показа 1 сек., но можно задать в ручную:
В секундах, например 3 секунды:
Код
/test.sh 3

Или в десятых секунды ( диапазон 1-9), например пол секунды:
Код
test.sh -u 5


Выглядит так:
Прикрепленное изображение

ПС: что бы остановить постоянный вывод не закрывая терминал - жмем ctrl+C

Сообщение отредактировал VINRARUS - 19.6.2013, 18:39
Прикрепленный файл test.zip   ( 506 байт ) Кол-во скачиваний: 141
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.7.2013, 11:19


Куратор темы

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

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

Рейтинг: 1211



Неплохой мануал по awk: http://khpi-iip.mipk.kharkiv.edu/library/e...usref/gl10.html
ПС: sed легче в понимании, но некоторые действия проще выполнить в awk.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DDA-E398
сообщение 16.11.2013, 15:35


Ветеран
*****

Группа: Пользователи
Сообщений: 372
Регистрация: 12.3.2008
Из: Нижегородская обл.
Пользователь №: 166 356
Модель телефона: E2, A910, Е398, ATRIX2
Прошивка: разные


Настроение:
Роботаю...



Рейтинг: 340



Немного не касаемо девайсов моторолы, но всё же...
Вобщем на роутере стоит DD-WRT и собственно в него вкручен самопальный адблок через dnsmasq
При каждом вкючении роутер тянет обновы блэклистов с серверов. Собсно это делается скриптом
Код

#!/bin/sh
sleep 10
logger WAN up script executing
if test -s /tmp/hosts0
then
        rm /tmp/hosts0
fi

logger Downloading...

wget -O - "http://winhelp2002.mvps.org/hosts.txt"  | grep 127.0.0.1 | sed '2,$s/127.0.0.1/0.0.0.0/g; s/[[:space:]]*#.*$//g;' | grep -v localhost | tr ' ' '\t' | tr -s '\t' | tr -d '\015' | sort -u >>/tmp/hosts0
wget -O - "http://someonewhocares.org/hosts/zero/hosts"  | grep 127.0.0.1 | sed '2,$s/127.0.0.1/0.0.0.0/g; s/[[:space:]]*#.*$//g;' | grep -v localhost | tr ' ' '\t' | tr -s '\t' | tr -d '\015' | sort -u >>/tmp/hosts0
wget -O - "http://jansal.googlecode.com/svn/trunk/adblock/hosts"  | grep 127.0.0.1 | sed '2,$s/127.0.0.1/0.0.0.0/g; s/[[:space:]]*#.*$//g;' | grep -v localhost | tr ' ' '\t' | tr -s '\t' | tr -d '\015' | sort -u >>/tmp/hosts0
wget -O - "http://adblock.gjtech.net/?format=hostfile"  | grep 127.0.0.1 | sed '2,$s/127.0.0.1/0.0.0.0/g; s/[[:space:]]*#.*$//g;' | grep -v localhost | tr ' ' '\t' | tr -s '\t' | tr -d '\015' | sort -u >>/tmp/hosts0
wget -O - "http://www.hostsfile.org/Downloads/hosts.txt"  | grep 127.0.0.1 | sed '2,$s/127.0.0.1/0.0.0.0/g; s/[[:space:]]*#.*$//g;' | grep -v localhost | tr ' ' '\t' | tr -s '\t' | tr -d '\015' | sort -u >>/tmp/hosts0

echo "0.0.0.0 rs.mail.ru" >>/tmp/hosts0
echo "0.0.0.0 wa.radar.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 mailua.hit.gemius.pl" >>/tmp/hosts0
echo "0.0.0.0 mail.radar.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 gstat.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 favicon.yandex.net" >>/tmp/hosts0
echo "0.0.0.0 headline.radar.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 an.yandex.ru" >>/tmp/hosts0
echo "0.0.0.0 ad.mail.ru" >>/tmp/hosts0
echo "0.0.0.0 img1.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 r3.mail.ru" >>/tmp/hosts0
echo "0.0.0.0 mailtest.cdnmail.ru" >>/tmp/hosts0
echo "0.0.0.0 splash.radar.imgsmail.ru" >>/tmp/hosts0
echo "0.0.0.0 ar.tns-counter.ru" >>/tmp/hosts0

grep addn-hosts /tmp/dnsmasq.conf ||
    echo "addn-hosts=/tmp/hosts0" >>/tmp/dnsmasq.conf
logger Restarting dnsmasq
killall dnsmasq
dnsmasq --conf-file=/tmp/dnsmasq.conf


Так вот в чём собсно прроблема... Некоторые домены дублируются + некоторые домены лочатся не за что (например clck.yandex.ru)
Помогите плиз допилить) Шелл я что-то стал подзабывать, хотя и юзаю никсы, но пишу в основном на перле и питоне.

Вобщем нужно добавить функцию которая будет удалять из блэклиста хорошие домены
И нужна более грамотно оформленная функция добавления доменов в блэклист
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.11.2013, 21:39


Куратор темы

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

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

Рейтинг: 1211



Цитата(DDA-E398 @ 16.11.2013, 17:35)
* wget -O - "http://someonewhocares.org/hosts/zero/hosts" | grep 127.0.0.1

Тут вообще ошибка, так как там 0.0.0.0 все.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 19.11.2013, 1:35


Куратор темы

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

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

Рейтинг: 1211



king.gif На:

Код
#!/bin/sh

echo "bu VINRARUS"
if [ -s /tmp/hosts0 ]
then
rm -f /tmp/banlist0
mv /tmp/hosts0 /tmp/banlist0
else
rm /tmp/hosts0
echo "" > /tmp/banlist0
fi
#### mnogopotok v shell o_O ####
rm -f /tmp/banlist1
rm -f /tmp/banlist2
rm -f /tmp/banlist3
rm -f /tmp/banlist4
rm -f /tmp/banlist5
echo "`wget -O - "http://winhelp2002.mvps.org/hosts.txt"`" > /tmp/banlist1 &
echo "`wget -O - "http://someonewhocares.org/hosts/zero/hosts"`" > /tmp/banlist2 &
echo "`wget -O - "http://jansal.googlecode.com/svn/trunk/adblock/hosts"`" > /tmp/banlist3 &
echo "`wget -O - "http://adblock.gjtech.net/?format=hostfile"`" > /tmp/banlist4 &
echo "`wget -O - "http://www.hostsfile.org/Downloads/hosts.txt"`" > /tmp/banlist5 &

RR=0
until [ -f "/tmp/banlist0" -a -f "/tmp/banlist1" -a -f "/tmp/banlist2" -a -f "/tmp/banlist3" -a -f "/tmp/banlist4" -a -f "/tmp/banlist5" ]
do
sleep 1
let RR=$RR+1
done
echo "$RR sec complite download" &
#### odnopotok ^_^ ####

#kusay RAM
OMG=`cat /tmp/banlist0
cat /tmp/banlist1
cat /tmp/banlist2
cat /tmp/banlist3
cat /tmp/banlist4
cat /tmp/banlist5`
rm -f /tmp/banlist0
rm -f /tmp/banlist1
rm -f /tmp/banlist2
rm -f /tmp/banlist3
rm -f /tmp/banlist4
rm -f /tmp/banlist5

echo "Loading..."
OMG=`echo "$OMG" | sed -e 's/127\.0\.0\.1/0.0.0.0/g' -e '/0\.0\.0\.0/!d' -e 's/ *#.*//' -e '/localhost/d' -e 's/\t/ /g' -e 's/  */ /g'
cat '/home/badlist'`
if [ -s "/home/coollist" ]
then
echo "$OMG" | tr -d '\015' | sort -u | grep -v -f "/home/coolist" > /tmp/hosts0
else
echo "$OMG" | tr -d '\015' | sort -u > /tmp/hosts0
fi
#facepalm
echo "" >> /tmp/hosts0
echo "Finish!"


/home/coolist - эти адреса будут удаляться из списка жбанов, писать так:
Цитата
motofan.ru
или так
0.0.0.0 motofan.ru

/home/badlist - эти адреса будут добавляться в список жбанов, писать так:
Цитата
0.0.0.0 vinrarus.ucoz.net


Сообщение отредактировал VINRARUS - 19.11.2013, 10:21
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DDA-E398
сообщение 19.11.2013, 10:11


Ветеран
*****

Группа: Пользователи
Сообщений: 372
Регистрация: 12.3.2008
Из: Нижегородская обл.
Пользователь №: 166 356
Модель телефона: E2, A910, Е398, ATRIX2
Прошивка: разные


Настроение:
Роботаю...



Рейтинг: 340



Спасиб большущее тебе, добрый человек!!!
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 12.9.2014, 21:28


Куратор темы

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

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

Рейтинг: 1211



Немного обновил шапку. king.gif

А еще недавно случайно наткнулся на код который выводит случайное число.
Удалось даже ускорить его собственными знаниями:
Код
dd if=/dev/urandom bs=256 count=1 | tr -dc 0-9 | head -c 8

Ну я не знаю кому как, а меня давно эта штука интересовала.

Сообщение отредактировал VINRARUS - 12.9.2014, 21:29
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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 килобайт ) Кол-во скачиваний: 102
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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 байт ) Кол-во скачиваний: 85
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 30.8.2016, 8:56


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(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 килобайт ) Кол-во скачиваний: 96
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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 240
Регистрация: 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
 

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

 



Текстовая версия Сейчас: 14.6.2025, 4:21

Форум живёт: