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

Написание скриптов #!/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
сообщение 26.9.2018, 20:26


Куратор темы

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

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

Рейтинг: 1211



Код
let TIME=07+1
let TIME=08+1

Интересный баг нашол в разных оболочках, 1 команда работает нормально, а 2я ошыбку даёт. pardon.gif Зачем то в шел восьмиричную систему числения запихнули.

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


Rock The Microphone
********

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


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



Рейтинг: 4609



Цитата(VINRARUS @ Сегодня, 3:26)
* Зачем то в шел восьмиричную систему числения запихнули.


Числа, начинающиеся с 0 всегда были восьмеричные. Соответственно с 0x -- шестнадцатиричные.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
igoripp2
сообщение 27.9.2018, 5:05


Новичок
*

Группа: Пользователи
Сообщений: 5
Регистрация: 21.8.2018
Пользователь №: 252 881
Модель телефона: Redmi 5
Прошивка: странная


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



Рейтинг: 0



Цитата(VINRARUS @ 27.9.2018, 2:18) *

Цитата(EXL @ Сегодня, 1:38)
* Числа, начинающиеся с 0 всегда были восьмеричные. Соответственно с 0x -- шестнадцатиричные.

Часто пользуешся? smile.gif

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


Куратор темы

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

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

Рейтинг: 1211



Shell имеет встроеную полезную команду eval: она помогает обходиться без костылей когда например нужно сгенерировать имя переменной (она выполняет любую команду внутри процеса, конешно если команда shell).
Так работать не будет:
Код
AH="UPS"
NUM="10"
$AH$NUM="text"
echo "$UPS10"

А так будет:
Код
AH="UPS"
NUM="10"
eval $AH$NUM="text"
echo "$UPS10"


Добавлено позже (30.9.2018, 3:17):
А ещо я тут понемногу учу shell обходиться без внешних команд. king.gif
Например такой awk:
Код
free | awk '{print $2}

можна заменить чистым шелом:
Код
free | (while read A B C; do echo "$B"; done)


Добавлено позже (30.9.2018, 3:35):
Вот такой немного заменитель sed (даже более) на чистом shell: в файле /home/file.txt ищет токо строчки начинающиеся со слова group, записывает следующее за ним слово в индивидуальную переменную (Большая буква английского алфавита), а ещо в переменную с таким же именем, но с буквой N в конце, записывает номер строки.
Код
SED(){
#bu VINRARUS
N=1
while read S1 S2 S3
do
if [ "$S1" = "group" ]
then
    eval "$1='$S2'"
    eval "${1}N='$N'"
    shift
fi
N=$(($N+1))
done < /home/file.txt
}
SED A B C D E F G Z

Таким способом shell может на порядки быстрее работать если нужно обрабатывать какую то сложную информацию, не страдая от тормозного Linux. dribble.gif

Добавлено позже (30.9.2018, 3:57):
Ну а shift кто не знает сдвигает аргументы на 1 позицыю (после введения команды shift переменная $2 переименовывается в $1, а $3 в $2 и т.д.).

Добавлено позже (30.9.2018, 21:17):
evil_2.gif Пример кошмарной рекурсии, когда переменная пишется сама в себя не зная собственного имени (эта зараза требует тотального экранирования всего шо шевелится, символом \).
Код
TEN=4
for S1 in *
do
eval "eval \"TEXT$TEN='$S1 \$TEXT$TEN'\""
done
echo "$TEXT4"

Демонстрационная програма просто выводит список файлов в обратном порядке, на самом же деле я эту рекурсию использовал в паре с предыдущим кодом. wink.gif

Сообщение отредактировал VINRARUS - 2.10.2018, 19:21
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 30.9.2018, 13:04


Гуру
******

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

Рейтинг: 400



VINRARUS,
смотря какая оболчка, у них же у всех разный набор команд есть. А еще есть всякие экзотические сборки, даже моторолка в sh добавила пару новый команд.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 30.9.2018, 13:25


Куратор темы

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

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

Рейтинг: 1211



fill.sa, eval, shift, read это POSIX-совместимые стандартные команды.
Да bash имеет расшыреный read например, но POSIX-совместимый код должет выполняться одинаково везде, включая bash.
Вот let да, не POSIX совместима команда, по этому я стараюсь от неё избавляться.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 1.10.2018, 5:36


Гуру
******

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

Рейтинг: 400



Цитата(VINRARUS @ Вчера, 14:25)
* но POSIX-совместимый код должет выполняться одинаково везде

по моему посикс не описывает как должен выполняться код, поидее многие проги стараются но не обязательно придерживаются этого стандарта, особенно эзотические, типо бузибокса. Помоему по посиксу даже ключей нету в одно букву, только --kluch.
Хотя у тебя скорее всего собраный типовой bash, тот что и под комп и в нем все тоже будет.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 1.10.2018, 19:44


Куратор темы

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

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

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 8:36)
* по моему посикс не описывает как должен выполняться код

А зачем он тогда нужен по твоему? blink.gif
Цитата(fill.sa @ Сегодня, 8:36)
* поидее многие проги стараются но не обязательно придерживаются этого стандарта

Если прога POSIX не совместима то ею никто для POSIX и использовать не будет.
Цитата(fill.sa @ Сегодня, 8:36)
* Помоему по посиксу даже ключей нету в одно букву, только --kluch.

А по моему наоборот.
Цитата(fill.sa @ Сегодня, 8:36)
* Хотя у тебя скорее всего собраный типовой bash

bash это образец говнокодинга, другими словами пример того как можна всё испортить с шыком. bad.gif
Он не пригоден для сложных програм (из за забагованости, от чего тотально сливает ash, dash, sh по скорости), по моему он и виноват в тотальном переходе на systemD.
bash пригоден для програм аля Hello word или построчного исполнения команд.
А кульминация идиотизма проявляется в системах где /bin/sh ссылается на bash.

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


Rock The Microphone
********

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


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



Рейтинг: 4609



Цитата(VINRARUS @ 27.9.2018, 3:26)
*
Часто пользуешся?


Так права для файлов smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.11.2018, 10:22


Куратор темы

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

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

Рейтинг: 1211



Пример того как на чистом шел прочитать 4ю строчку файла, например файла /proc/meminfo. happy.gif
Номер строки выставляется по количеству "read Z" внутри цыкла, в даном случае их 4.
Код
while true
do
read Z
read Z
read Z
read Z
echo "$Z"
break
done < /proc/meminfo

Код очень эфективен, не требуется арифметических операций подщота номера строк, а после чтения нужной строки он завершается (не читает файл до конца).
Наиболее полезен если нужно читать первые строки. Но если нужна строка номером где то 100+ то он будет очень громоздким (105+ строк кода shok.gif ).
По этому для таких ситуаций более полезен вариант с арифметическим подщотом строк (для примера тут лиш 4, меняется на любое число при том же размере кода):
Код
N=0
until [ "$N" = "4" ]
do
N=$((N+1))
read Z
done < /proc/meminfo
echo "$Z"

ПС: while и until это цыклы, но с обратной логикой (while выполняется пока условие соблюдается, а until наоборот пока оно ошыбочно).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

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

 



Текстовая версия Сейчас: 18.4.2024, 1:22

Форум живёт: