Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
linux:overall:bash:scripts [2021/04/20 10:27] admin создано |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Скриптинг ====== | ||
- | |||
- | Первой строкой указывается т.н. **shebang (#!)** - последовательность двух символов, | ||
- | Если оболочка не указана явно, используется так же, что и запускает данный скрипт.\\ | ||
- | |||
- | Для исполнения скрипта, | ||
- | Если путь к скрипту указан в **$PATH** (например **/ | ||
- | |||
- | **Комментарии** предваряются символом решетки (**#**).\\ | ||
- | **exit** - сообщает результат **(0-успех)** работы родительскому процессу, | ||
- | |||
- | ===== Аргументы (доступ к ним) ===== | ||
- | * **&?** - код возврата последнего процесса (функции или скрипта). | ||
- | * **& | ||
- | * **&#** - кол-во переданных аргументов. | ||
- | * **&*** - все аргументы одной строкой. | ||
- | * **&@** - все аргументы отдельной строкой. | ||
- | * **&-** - список флагов, | ||
- | * **shift** - команда, | ||
- | ===== Переменные ===== | ||
- | Переменные могут быть определены **статически** (name=value), | ||
- | |||
- | Знак доллара (**$**) используется только **при чтении** значения переменной, | ||
- | **Двойные кавычки** - " | ||
- | При определении переменных **не используйте пробелы**.\\ | ||
- | Конкатенация строк происходит без дополнительных символов: | ||
- | |||
- | ==== Встроенные переменные ==== | ||
- | * **$BASH** - путь к исполняемому файлу bash. | ||
- | * **$GROUPS** - группы пользователя. | ||
- | * **$HOME ** - домашний каталог. | ||
- | * **$HOSTNAME ** - сетевое имя хоста. | ||
- | * **$SHLVL ** - уровень вложенности shell. | ||
- | * **$SECONDS** - время работы скрипта. | ||
- | * **$REPLY** - для ввода read, по умолчанию. | ||
- | |||
- | ===== Условный оператор ===== | ||
- | Проверяет, | ||
- | Условие условие проверяется с помощью команды [[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> | ||
- | |||
- | ==== 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 = (' | ||
- | |||