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

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

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

 



Текстовая версия Сейчас: 28.3.2024, 23:58

Форум живёт: