Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
linux:overall:bash:scripts [2022/08/14 07:46] admin |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Скриптинг ====== | ||
- | |||
- | Первой строкой указывается т.н. **shebang (#!)** - последовательность двух символов, | ||
- | Если оболочка не указана явно, используется так же, что и запускает данный скрипт.\\ | ||
- | |||
- | Для исполнения скрипта, | ||
- | Если путь к скрипту указан в **$PATH** (например **/ | ||
- | |||
- | **Комментарии** предваряются символом решетки (**#**).\\ | ||
- | **exit** - сообщает результат **(0-успех)** работы родительскому процессу, | ||
- | |||
- | |||
- | |||
- | ===== Аргументы (доступ к ним) ===== | ||
- | * **$?** - код возврата последнего процесса (функции или скрипта). | ||
- | * **$№** - аргументы, | ||
- | * **$#** - кол-во переданных аргументов. | ||
- | * **$*** - все аргументы одной строкой. | ||
- | * **$@** - все аргументы отдельной строкой. | ||
- | * **$-** - список флагов, | ||
- | * **shift** - команда, | ||
- | |||
- | |||
- | ===== Переменные ===== | ||
- | **Пробелы не используются при определении**\\ | ||
- | Знак доллара используется только **при чтении** значения, | ||
- | В фигурных скобках более строгая форма (${variable}).\\ | ||
- | **Двойные кавычки** - " | ||
- | Конкатенация строк происходит без дополнительных символов: | ||
- | |||
- | |||
- | ==== Встроенные переменные ==== | ||
- | * **$BASH** - путь к исполняемому файлу bash. | ||
- | * **$GROUPS** - группы пользователя. | ||
- | * **$HOME ** - домашний каталог. | ||
- | * **$HOSTNAME ** - сетевое имя хоста. | ||
- | * **$SHLVL ** - уровень вложенности shell. | ||
- | * **$SECONDS** - время работы скрипта. | ||
- | * **$REPLY** - для ввода read, по умолчанию. | ||
- | |||
- | |||
- | ===== Условный оператор ===== | ||
- | |||
- | **Двойные квадратные скобки** работают в целом так же, как и [одинарные квадратные скобки], | ||
- | **Двойные круглые скобки** это конструкция, | ||
- | <code bash> | ||
- | if [[ " | ||
- | ... | ||
- | elif [[ " | ||
- | ... | ||
- | else | ||
- | ... | ||
- | fi | ||
- | |||
- | if [ " | ||
- | echo "What an oldy." | ||
- | fi | ||
- | </ | ||
- | |||
- | <code bash> | ||
- | (( count++ )) | ||
- | echo " | ||
- | |||
- | if (( -57 + 30 + 27 )); then | ||
- | echo "First one" | ||
- | | ||
- | echo $(( (5 > 3) + (0 == 0) )) | ||
- | </ | ||
- | |||
- | |||
- | В условии можно использовать **код завершения любой команды**\\ | ||
- | <code bash> | ||
- | if grep -q coffee dialogue.txt; | ||
- | |||
- | if cmp a b &> /dev/null; then ... fi | ||
- | </ | ||
- | |||
- | |||
- | < | ||
- | < | ||
- | <code bash> </ | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | < | ||
- | < | ||
- | Проверяет, | ||
- | Условие условие проверяется с помощью команды [[main: | ||
- | Условия можно указать следующими способами: | ||
- | * **if test -z $1** | ||
- | * **if / | ||
- | * **if [ -z $1 ]** | ||
- | * **if /usr/bin/[ -z $1** | ||
- | * **if [[ -z $1 ]']** - расширенный вариант простых скобок. Внутри допустимы операторы && || < и >. | ||
- | * **[ -z $1 ]** - условие может быть проверено из без оператора **if** | ||
- | * **() или двойные** - выполняет арифметическое действие внутри. **Код возврата противоположен []** | ||
- | |||
- | Условный оператор проверяет код завершения **любой команды**, | ||
- | <code bash>if cmp a b | ||
- | then echo " | ||
- | else echo " | ||
- | fi</ | ||
- | |||
- | Оператор **if** можно и не использовать. | ||
- | <code bash>[ -z $1 ] && echo result false | ||
- | или | ||
- | ping -c 1 8.8.8.8 &>/ | ||
- | </ | ||
- | |||
- | |||
- | ==== Else if (elif) ==== | ||
- | **elif** - краткая форма записи конструкции **else if**. | ||
- | <code bash>if [ expr ]; then | ||
- | action | ||
- | elif [ expr ]; then | ||
- | action | ||
- | else | ||
- | action | ||
- | fi | ||
- | </ | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | ===== Циклы ===== | ||
- | ==== for ==== | ||
- | Обработка диапазонных значений.\\ | ||
- | **for** условие **do** действие **done**. | ||
- | <code bash> for (( i=100; i>1; 1-- )); do action; done </ | ||
- | |||
- | Внутри **((..)' | ||
- | |||
- | Так же, можно указать диапазон: | ||
- | <code bash>for i in {100..104}; do action; done </ | ||
- | <code bash>for i in 100 101 102 103 104; do action; done </ | ||
- | <code bash>for i in $@; do action; done </ | ||
- | <code bash> | ||
- | for i in `echo $numbers`; do action; done </ | ||
- | |||
- | |||
- | |||
- | ==== while ==== | ||
- | Выполняется пока условие истинно.\\ | ||
- | **while** условие **do** действие **done**. | ||
- | <code bash> | ||
- | В двойных скобках символ **$** перед переменной можно опустить, | ||
- | <code bash> | ||
- | |||
- | < | ||
- | < | ||
- | Бесконечный цикл | ||
- | <code bash> | ||
- | while true | ||
- | do | ||
- | echo " | ||
- | sleep 2 | ||
- | done | ||
- | </ | ||
- | |||
- | |||
- | </ | ||
- | |||
- | |||
- | |||
- | ==== Until ==== | ||
- | Противоположно циклу **while**, выполняется пока условие ложно. | ||
- | **until** условие **do** действие **done**. | ||
- | Все остальное аналогично. | ||
- | |||
- | |||
- | |||
- | ===== case ===== | ||
- | <code bash> | ||
- | val1) | ||
- | action1;; | ||
- | val2) | ||
- | action2;; | ||
- | *) | ||
- | default action;; | ||
- | esac | ||
- | </ | ||
- | |||
- | |||
- | |||
- | ===== Работа со строками ===== | ||
- | **Длина строки: | ||
- | <code bash> | ||
- | echo `expr length $string` | ||
- | </ | ||
- | |||
- | **Извлечение подстроки** | ||
- | <code bash> | ||
- | ${string: | ||
- | expr substr $string $position $length | ||
- | </ | ||
- | |||
- | **Удаление части строки** | ||
- | <code bash> | ||
- | ${string%(%%)substring} # Удаляет самую короткую (длинную), | ||
- | </ | ||
- | |||
- | **Замена подстроки** | ||
- | <code bash> | ||
- | ${string// | ||
- | </ | ||
- | |||
- | |||
- | |||
- | ===== Отладка ===== | ||
- | Для отладки, | ||
- | |||
- | |||
- | ===== Примеры ===== | ||
- | **" | ||
- | Используется минимум два скрипта, | ||
- | <code bash> for CurrAddr in {1..25}; do | ||
- | ./oneping $CurrAddr & # Там происходит просто пинг переданного адреса | ||
- | done | ||
- | # В итоге, ждем тайм-аут один раз, для всех хостов | ||
- | </ | ||
- | |||
- | |||
- | |||
- | ===== Утилита test ===== | ||
- | |||
- | Unix утилита для проверки типа файла и сравнения значений.\\ | ||
- | Возвращает 0 (истина) или 1 (ложь). Выражения могут быть как унарными так и бинарными.\\ | ||
- | |||
- | **Использование: | ||
- | **Пример: | ||
- | then | ||
- | rm file.txt | ||
- | else | ||
- | echo 'no found' | ||
- | fi | ||
- | </ | ||
- | |||
- | |||
- | |||
- | ==== Параметры запуска ==== | ||
- | * **-d file** - если file существует и является директорией. | ||
- | * **-e file** - если file существует. | ||
- | * **-f file** - если file существует и является обычным файлом. | ||
- | * **-k file** - если file существует и ему установлен " | ||
- | * **-L file** - если file существует и является символьной ссылкой. | ||
- | * **-r (-w/-x) file** - если file существует и читаем (записываем/ | ||
- | * **-z str** - если длина 0. | ||
- | * **-n str** - если длина не 0. | ||
- | * **-a (-o)** - аналог && (||) в одинарных скобках. | ||
- | * **str1 = (' | ||
- | |||
- | |||
- | ===== Функции. Возврат значения ===== | ||
- | |||
- | **function_name() {command... }**\\ | ||
- | Объявляются раньше вызова, | ||
- | **return** возвращает только интовое значение, | ||
- | |||
- | |||
- | |||
- | ===== Примеры ===== | ||
- | |||
- | < | ||
- | < | ||
- | |||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | # Входные параметры можно передать аргументами, | ||
- | # Если что то не передано, | ||
- | |||
- | isNewMultip=false | ||
- | |||
- | CRed=' | ||
- | CGreen=' | ||
- | CCyan=' | ||
- | CNone=' | ||
- | |||
- | # Разбираем аргументы | ||
- | while getopts :i:f:n:a: flag | ||
- | do | ||
- | case " | ||
- | i) importName=$OPTARG;; | ||
- | f) multipName=$OPTARG;; | ||
- | n) multipName=$OPTARG | ||
- | isNewMultip=true;; | ||
- | a) hostIP=$OPTARG;; | ||
- | *) printf "$0 [OPTIONS]\n | ||
- | exit;; | ||
- | esac | ||
- | done | ||
- | |||
- | importName=$(sed ' | ||
- | multipName=$(sed ' | ||
- | hostIP=$(grep -Po " | ||
- | |||
- | |||
- | # -= Если не передано в аргументах или некорректно, | ||
- | if [ -z ${hostIP} ]; then | ||
- | listIP=($( ip a | grep -Po "inet \K[^/ | ||
- | if [[ ${# | ||
- | printf ' | ||
- | while read -p " | ||
- | hostIP=$(grep -Po " | ||
- | if [ -n " | ||
- | break | ||
- | fi | ||
- | done | ||
- | else | ||
- | hostIP=${listIP[0]} | ||
- | fi | ||
- | fi | ||
- | |||
- | |||
- | if [ -z " | ||
- | listImports=($( cat / | ||
- | echo -e " | ||
- | printf ' | ||
- | |||
- | while read -p " | ||
- | importName=$(sed ' | ||
- | if [ -n " | ||
- | break | ||
- | fi | ||
- | done | ||
- | fi | ||
- | |||
- | |||
- | if [ -z " | ||
- | listMultips=($( cat / | ||
- | echo -e " | ||
- | printf ' | ||
- | |||
- | while read -p " | ||
- | multipName=$(sed ' | ||
- | if [ -n " | ||
- | break | ||
- | fi | ||
- | done | ||
- | |||
- | if [[ ! " | ||
- | echo -e " | ||
- | select yn in " | ||
- | case $yn in | ||
- | Yes) isNewMultip=true; | ||
- | No) echo -e " | ||
- | esac | ||
- | done | ||
- | fi | ||
- | fi | ||
- | |||
- | |||
- | # -= Ищем свободные порты =- | ||
- | # Мультипликатор | ||
- | # Команный порт | ||
- | listPorts=($(cat / | ||
- | (( listPorts[-1]++ )) | ||
- | while $(ss -tulpn | grep -q : | ||
- | (( listPorts[-1]++ )) | ||
- | done | ||
- | multipCommandPort=${listPorts[-1]} | ||
- | |||
- | # Jmx порт | ||
- | listPorts=($(cat / | ||
- | (( listPorts[-1]++ )) | ||
- | while $(ss -tulpn | grep -q : | ||
- | (( listPorts[-1]++ )) | ||
- | done | ||
- | multipJmxPort=${listPorts[-1]} | ||
- | |||
- | # Импорт | ||
- | # Команный порт | ||
- | listPorts=($(cat / | ||
- | (( listPorts[-1]++ )) | ||
- | while $(ss -tulpn | grep -q : | ||
- | (( listPorts[-1]++ )) | ||
- | done | ||
- | importCommandPort=${listPorts[-1]} | ||
- | |||
- | # Jmx порт | ||
- | listPorts=($(cat / | ||
- | (( listPorts[-1]++ )) | ||
- | while $(ss -tulpn | grep -q : | ||
- | (( listPorts[-1]++ )) | ||
- | done | ||
- | importJmxPort=${listPorts[-1]} | ||
- | |||
- | |||
- | # -= Создаем импорт =- | ||
- | $(cp -r ClearImport "/ | ||
- | |||
- | # Меняем права доступа юзеру mgaimport | ||
- | $(chown -R mgaimport: | ||
- | |||
- | # Пишем параметры в " | ||
- | changeFile="/ | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | |||
- | # Пишем параметры в " | ||
- | changeFile="/ | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | |||
- | # Делаем запись в общем конфиге | ||
- | changeFile="/ | ||
- | $(printf " | ||
- | # ---------------------------------------- # | ||
- | ENABLE=" | ||
- | JAVA_HOME=/ | ||
- | START_USER=mgaimport | ||
- | START_TIME=30 | ||
- | STOP_TIME=90 | ||
- | COMMAND_PORT=${importCommandPort} | ||
- | WORKSPACE=/ | ||
- | |||
- | CMD=' | ||
- | -XX: | ||
- | -XX: | ||
- | -Xmx16G | ||
- | -Xms3G | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -Dcom.sun.management.jmxremote | ||
- | -Dcom.sun.management.jmxremote.port=${importJmxPort} | ||
- | -Dcom.sun.management.jmxremote.authenticate=false | ||
- | -Dcom.sun.management.jmxremote.ssl=false | ||
- | -Djava.rmi.server.hostname=${hostIP} | ||
- | -Djava.net.preferIPv4Stack=true | ||
- | -jar mgaimport.jar' | ||
- | |||
- | |||
- | if [ $isNewMultip ]; then | ||
- | # -= Создаем мультипликатор =- | ||
- | $(cp -r ClearFileMultiplicator "/ | ||
- | |||
- | # Меняем права доступа юзеру mgaimport | ||
- | $(chown -R mgaimport: | ||
- | |||
- | # Пишем параметры | ||
- | changeFile="/ | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | $(sed -i ' | ||
- | |||
- | |||
- | # Делаем запись в общем конфиге | ||
- | changeFile="/ | ||
- | $(printf " | ||
- | # ----------------------------------- # | ||
- | ENABLE=" | ||
- | JAVA_HOME=/ | ||
- | START_USER=mgaimport | ||
- | START_TIME=5 | ||
- | STOP_TIME=10 | ||
- | WORKSPACE=/ | ||
- | |||
- | CMD=' | ||
- | -XX: | ||
- | -XX: | ||
- | -XX: | ||
- | -Xmx2G | ||
- | -Dcom.sun.management.jmxremote | ||
- | -Dcom.sun.management.jmxremote.port=${multipJmxPort} | ||
- | -Dcom.sun.management.jmxremote.authenticate=false | ||
- | -Dcom.sun.management.jmxremote.ssl=false | ||
- | -Djava.rmi.server.hostname=${hostIP} | ||
- | -Djava.net.preferIPv4Stack=true | ||
- | -jar filemultiplicator-all.jar' | ||
- | |||
- | # Создаем входящую директорию мультипа | ||
- | $(install -d -m 775 -o mgaimport -g mgaimport "/ | ||
- | |||
- | # Запись в самбу | ||
- | changeFile="/ | ||
- | $(printf " | ||
- | path = / | ||
- | guest ok = no | ||
- | browsable = no | ||
- | writeable = yes | ||
- | create mask = 0770 | ||
- | directory mask = 0770 | ||
- | write list = xlogssupplier | ||
- | valid users = xlogssupplier | ||
- | force user = mgaimport | ||
- | force group = mgaimport\n" | ||
- | |||
- | # Перезапускаем самбу | ||
- | $(systemctl restart smb && systemctl status smb) | ||
- | |||
- | # Напоминаем пользователю что нужно примонтировать ее на источнике источника | ||
- | printf " | ||
- | Создана входящая папка для файлмультипликатора ${CCyan} \"/ | ||
- | К ней ${CRed}открыт сетевой доступ${CNone} через \" | ||
- | |||
- | else | ||
- | # -= Используем существующий =- | ||
- | # Дозапись в конфиг еще новый сервис | ||
- | changeFile="/ | ||
- | $(printf " | ||
- | name = \" | ||
- | destDir = \"/ | ||
- | pattern = \" | ||
- | |||
- | # Перезапуск сервиса, | ||
- | $("/ | ||
- | $("/ | ||
- | fi | ||
- | |||
- | |||
- | # -= Создаем входящую папку импорта и папки для ошибок =- | ||
- | $(install -d -m 775 -o mgaimport -g mgaimport "/ | ||
- | $(install -d -m 775 -o mgaimport -g mgaimport "/ | ||
- | $(install -d -m 775 -o mgaimport -g mgaimport "/ | ||
- | |||
- | |||
- | printf " | ||
- | Параметры следующие: | ||
- | Имя: ${CCyan}${importName}${CNone} | ||
- | Расположение: | ||
- | Входящая директория: | ||
- | Jmx-порт: | ||
- | Командный порт: ${CCyan}${importCommandPort}${CNone} | ||
- | Конфигурация импорта: | ||
- | Общая конфигурация всех импортов: | ||
- | Файл мультипликатор: | ||
- | |||
- | Укажите ${CCyan}параметры импорта в БД${CNone} в файле конфигурации импорта | ||
- | Используя Jmx-порт, | ||
- | </ | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||