motofan logo
26 страниц V < 1 2 3 4 > »         
> 

Написание скриптов #!/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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Programmer-tm(Мотофан.)
сообщение 12.6.2011, 11:46


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

Группа: Пользователи
Сообщений: 1 681
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto X Play
Прошивка: Модифицированная...


Настроение:
Делать невозможное возможным...



Рейтинг: 620



А по скрипту кто нить сможет помочь?
Нужна команда, которая удалит первый символ из названия файла.

Название файла пишется в переменную VINF (VINF=1234.567)
Такая конструкция: ${VINF:1} работать отказалась.

Вопрос решён.

Сообщение отредактировал Programmer-tm(Мотофан.) - 13.6.2011, 11:59
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
DaNTaLiaN™
сообщение 17.6.2011, 19:42


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

Группа: Пользователи
Сообщений: 321
Регистрация: 28.11.2009
Из: СПб
Пользователь №: 210 392
Модель телефона: Motorola

Рейтинг: 536



Пытался написать по подобию скрипт для zpk архива и что-то у меня не получается... в чем ошибка?
Цитата
#!/bin/sh

mypath=${0%/*}

showQ "ver2" "Установить" 1
if [ $? != 0 ]
then
mkdir /mmc/movinand1/mpkgbox
cp $mypath/mpkgbox/* /mmc/movinand1/mpkgbox
fi

else
if [ $? != 0 ]
then
showQ "ver2" "Удалить" 1
rm -rf /ezxlocal/zmodstuff/zpk/ver2
rm -rf /mmc/movinand1/mpkgbox
fi
;;
*)


VINRARUS, время в любом случае не будет потрачено в пустую

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


Куратор темы

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

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

Рейтинг: 1211



DaNTaLiaN™, есть серьезные но простые ошыбки, вот вроде правильно.

Код
#!/bin/sh

mypath=${0%/*}

showQ "ver2" "Установить?" 1
if [ $? != 0 ]
then
mkdir /mmc/movinand1/mpkgbox
cp $mypath/mpkgbox/* /mmc/movinand1/mpkgbox

else

showQ "ver2" "Удалить?" 1
if [ $? != 0 ]
then
rm -rf /ezxlocal/zmodstuff/zpk/ver2
rm -rf /mmc/movinand1/mpkgbox
fi
fi


Количество if всегда должно соответствовать количеству fi clapping.gif


Знач завтра займусь началом мануала. smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.6.2011, 18:40


Куратор темы

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

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

Рейтинг: 1211



wizard.gif Знач начну с основ.

Shell скрипт (SH) - это обычный текстовый файлик с кодировкой UTF в котором в основном английскими буквами и специальными символами написаны команды (хотя например какие то параметры могут содержать кириллицу и иероглифы), которые потом может выполнять система, а точнее программка по пути /bin/sh (у меня это символическая ссылка на /bin/busybox)
Shell скрипт выполняет те самые команды что и терминал или телнет, и синтаксис почти однаковый, просто в терминале есть возможность работать в режиме реального времени и задавать команды напряму во время работы некоторых программ, а в скриптах все параметры задаются заранее, и изменять их во время работы скрипта нельзя потому что Shell скрипты не имеют графической оболочки, но для этой цели были созданы шоумодули для линукс-моторов!
Для запуска скрипта есть 2 способа:
1) просто прописать путь к скрипту
Код
/mmc/mmca1/skriptik.sh

и при такой команде скрипт выполнится при 2х условиях:
1.Права файла-скрипта должны разрешать запуск исполняемого файла (например 775 или 777)
2.В начале скрипта должна присутствовать точно такая первая строчка:
Код
#!/bin/sh

Хотя из терминала можна запускать и без этой строчки, но zLauncher например не понимает чем его запустить, поэтому лучше ее прописать.
2) перед путьом к скрипту прописать путь к программке которая будет исполнять его, то есть /bin/sh
Код
/bin/sh /mmc/mmca1/skriptik.sh

И в таком случае не нужны ни права на запуск, ни #!/bin/sh, хотя они и не помешают

По поводу расширения в названии файла например "skriptik.sh":
Расширение для линукс-системы не важно, например если попытаться запустить скрипт с названием "skriptik.jpg", то никаких проблем не будет, так само можна назвать вообще без расширения "skriptik", но расширение важно только для ассоциаций, например в стандартном ФМ, ну и для визуального ориентирования.

spartak.gif Вот основные правила синтаксиса:
  • В командах скрипта важен каждый символ и даже пробел, иногда из за невнимательности получаются большие проблемы с работой скрипта.
  • И регистр букв тоже важен, например команды "sleep" и "SLEEP" являются совершенно разными командами.
  • Если в начале строчки стоит решётка "#", то вся эта строчка не воспринимается системой, но если решетка входит в область выделенную кавычками, то она воспринимается как текст. В основном используется для подсказок или визуального разделителя. Также решётка может стоять сразу после команды, и опять же часть строчки после нее не воспринимается системой
  • smile.gif Есть 3 вида кавычек: " ` ', и нельзя открыть одной кавычкой, а закрыть другой, потому что так еще одно поле откроется:
    Код
    echo 'hot "dog '$FS'" otak"`free`"'


    ` - заключенные в них слова сразу выполняются системой как команда, и в место этого появляется текст который продиктовала выполняемая команда.
    Код
    `echo 58945`
    =
    Код
    58945


    " - используется для объединения текста который может содержать как пробелы, так и много строк, и текст заключенный в них воспринимается так одно слово, используется для переменных и для команд запуска например шоумодулей, переменные заменяются своим значением ,а если где то в выделенном тексте есть команда выделенная такими кавычками ``, то нужно читать выше описание.
    Код
    "kupa `echo 58945`"
    =
    Код
    kupa 58945


    ' - эти кавычки действуют наподобе как `, только наоборот, то есть если в них заключены или переменные, или любые системные символы, или даже команда взята в ``, то система будет воспринимать выделенную область как простой текст, не обращая внимание на содержание.
    Код
    ' "kupa `echo 58945`" '
    =
    Код
    "kupa `echo 58945`"

  • smile.gif $ - это символ переменной, а переменная - это как бы маленькая закладка на ранее заданное значение. Задается с новой строки так:
    Код
    VoDoChKa="Пить вредно!"

    И при упоминании далее переменной вместо нее вставляется заданный текст:
    Код
    Совет с того света:$VoDoChKa
    =
    Код
    Совет с того света:Пить вредно!

    Иногда бывает что после переменной сразу нужно написать текст без пробела и других символов, и поэтому чтобы переменная работала, можна ее выделить таким способом:
    Код
    ${VoDoChKa}наверно
    =
    Код
    Пить вредно!наверно

  • smile.gif if - условный оператор, который действует по такому принципу: если чото, то это, или если чото, то это, или же это, конец.
    Одна из самых полезных функций скриптов!
    Вот пример который ориентируется на значение переменной $GRIB:
    Код
    if [ "$GRIB" = "1" ]
    then
    echo "1 gribok"
    elif [ "$GRIB" = "2" ]
    then
    echo "2 gribka"
    elif [ "$GRIB" = "3" ]
    then
    echo "3 gribka"
    else
    echo "nema gribka"
    fi

    Или еще такой вариант:
    Код
    if [ "$GRIB" = "1" ]
    then
    echo "1 gribok"
    else
    echo "nema gribka"
    fi

    И количество if всегда должно соответствовать количеству fi
Пока все, потом еще буду писать. fan_1.gif

Сообщение отредактировал VINRARUS - 18.6.2011, 19:49
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Programmer-tm(Мотофан.)
сообщение 19.6.2011, 11:24


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

Группа: Пользователи
Сообщений: 1 681
Регистрация: 21.3.2010
Из: Из мира сего
Пользователь №: 215 291
Модель телефона: Moto X Play
Прошивка: Модифицированная...


Настроение:
Делать невозможное возможным...



Рейтинг: 620



Цитата(VINRARUS @ 19.6.2011, 14:07) *

Будет кому полезен мануал такого плана? wink.gif

Конечно. Сам собираюсь писать на shell уже пару простеньких программок собрал...

Еще бы для новичка не плохо написать какие есть выводы Show модулей и как их задействовать.

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


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

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

Рейтинг: 1335.5



#!/bin/sh

showQ "Очистити базу?" "По завершенні процесу телефон буде перезавантежено і база даних автоматично обновиться!" 1
[ $? -ne 1 ] && exit
rm /mmc/mmca1/.sd_dbmss
rm /mmc/mmca1/.thumbindex
rm /mmc/mmca1/.thumbinal
rm /mmc/mmca1/.udstate
rm /mmc/movinand1/.udstate
rm /mmc/movinand1/.thumbindex
rm /mmc/movinand1/.sd_dbmss
rm /mmc/movinand1/.thumbina
nice -n -20 mot_reboot
Почему у меня такое не работает? Ничего не происходит.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 19.6.2011, 12:45


Куратор темы

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

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

Рейтинг: 1211



Код
#!/bin/sh

showQ "Очистити базу?" "По завершенні процесу телефон буде перезавантежено і база даних автоматично обновиться!" 1
if [ $? -ne 1 ]
then
exit
fi
rm /mmc/mmca1/.sd_dbmss
rm /mmc/mmca1/.thumbindex
rm /mmc/mmca1/.thumbinal
rm /mmc/mmca1/.udstate
rm /mmc/movinand1/.udstate
rm /mmc/movinand1/.thumbindex
rm /mmc/movinand1/.sd_dbmss
rm /mmc/movinand1/.thumbina
nice -n -20 mot_reboot

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


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(VINRARUS @ Сегодня, 14:07)
* Будет кому полезен мануал такого плана?
мне тоже нужно, хотя и не для телефона, пиши обязательно!
интересуют ещё такие строки что в них описывается
until [ `cat /tmp/resolv.conf | grep -c nameserver` -gt 0 ]

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


Куратор темы

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

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

Рейтинг: 1211



Продолжу с команд для if smile.gif


Дальше описаны какие еще опции могут быть заключены в квадратные скобки.
Рассмотрим уже знакомую строчку:
Код
if [ "$GRIB" = "1" ]

С опцией "=" (идентичные значения по обе стороны "=") мы уже познакомились, она обрабатывает равные ли заданные значения, и не важно буквы там или цифры, так сказать проверяет идентичны ли 2 набора символов.
Существует способ легко изменить опцию на противоположную, поставив перед ней знак "!" (звучит как НЕ)
Например строчка:
Код
if [ "$GRIB" != "1" ]

уже проверяет наоборот разные ли значения по обе стороны знаков "!=".
Ну это незаменимо для использования с "elif", ну и для "if" тоже нужно (хотя для "if" для этой цели можно использовать "else").
clapping.gif Только нужно обязательно запомнить что символ "!" с символом "=" ВСЕГДА пишется слитно без пробелов между ими, а вот с другими опциями через ОДИН ПРОБЕЛ

rabby.gif Вот список всех опций:

Сравнение целых чисел:

-gt больше чем
-lt меньше чем
-ge больше чем либо равно
-le меньше чем либо равно
-eq равно
-ne не равно

Сравнение строк:

-z проверка на наличие пустой строки
-n проверка на наличие строки-значения
= равенство
!= неравенство
str проверка на наличие строки,состоящей из нулей

Логические операции:

-a И
-o ИЛИ
! НЕ

Проверка файлов:

-f установка факта существования файла и его регулярности
-s проверка,не является-ли файл пустым
-r проверка возможности считывания файла
-w проверка возможности записи файла
-x проверка исполняемости файла
-d проверка,является-ли файл каталогом
-h проверка,является-ли файл ссылкой
-c проверка,является-ли файл байт-ориентированным устройством
-d проверка,является-ли файл блок-ориентированным устройством

Примеры:

Код
if [ -f /mmc/mmca1/muzica/trecklist.txt ]
then
echo YES
fi

Проверяет существует ли файл по этому пути, если нет или если это каталог, то ничего не делать.
Нужно заметить что если в пути к файлу\папке есть пробелы, то нужно путь брать в кавычки, иначе скрипт перестанет работать на этом условии.

Код
if [ 2 -lt 4 -a 8 != GR ]
then
echo URAA
fi

Проверяет меньше ли "2" за "4", и не идентичные ли значения "8" и "GR", и в случае если оба условия верны выполняется команда "echo URAA" (которая работает только в телнете или терминале и выводит слово "URAA")

Код
if [ ! -z "$GG" ]
then
echo aga
fi

Проверяет пустая ли переменная "$GG", если нет то выполняет "echo aga".
Также для этого действия можно написать такое условие:
Код
if [ "$GG" != "" ]
then
echo aga
fi




clapping.gif
И обязательно в условиях переменную нужно брать в двойные скобки (как и все слова с пробелами), потому что если в переменной будет пробел, а условие очень чувствительно к пробелам, то скрипт потерпит крах при выполнении!
Хотя если точно известно что значение переменной без пробелов и что она не пустая, то можно и без кавычек (хотя лучше перестраховаться)


Ну и нужно быть внимательным чтобы после "[" и перед "]" ОБЯЗАТЕЛЬНО стояли пробелы, иначе если вместо пробелов будет стоять другой символ, то скрипт на этом условии завершится с ошибкой!


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

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

 



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

Форум живёт: