Инструменты пользователя

Инструменты сайта


linux:overall:bash:scripts

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:overall:bash:scripts [2021/05/06 09:43]
admin
— (текущий)
Строка 1: Строка 1:
-====== Скриптинг ====== 
- 
-Первой строкой указывается т.н. **shebang (#!)** - последовательность двух символов, далее указывается путь к исполняющему файлу под-оболочки, так же, в этой строке можно передавать аргументы.\\ 
-Если оболочка не указана явно, используется так же, что и запускает данный скрипт.\\ 
- 
-Для исполнения скрипта, у файла должно быть разрешение выполнения (**+x**), но если передать скрипт аргументом команде **bash ./script**, тогда бит необязателен.\\ 
-Если путь к скрипту указан в **$PATH** (например **/usr/local/bin/** либо **/bin/**), то запускать можно просто по имени, без "**./**".\\ 
- 
-**Комментарии** предваряются символом решетки (**#**).\\ 
-**exit** - сообщает результат **(0-успех)** работы родительскому процессу, при отсутствии используется результат последней команды.\\ 
- 
-===== Аргументы (доступ к ним) ===== 
-  * **$?** - код возврата последнего процесса (функции или скрипта). 
-  * **$№** - аргументы, по номеру. &0 - последний запущенный скрипт. 
-  * **$#** - кол-во переданных аргументов. 
-  * **$*** - все аргументы одной строкой. 
-  * **$@** - все аргументы отдельной строкой. 
-  * **$-** - список флагов, переданных скрипту. 
-  * **shift** - команда, после нее первый аргумент в $@ теряется, остальные сдвигаются влево. 
-===== Переменные ===== 
-Переменные могут быть определены **статически** (name=value), либо **динамически** (ввод пользователя или результат команды, например **read TEXT** или **TODAY=$(date +%d-%m-%y)**).\\ 
- 
-Знак доллара (**$**) используется только **при чтении** значения переменной, остальная работа с переменной без этого знака. $variable == ${variable} (более строгая форма).\\ 
-**Двойные кавычки** - "нестрогие", и не влияют на механизм подстановки, в отличии от **одинарных кавычек**, которые являются "строгими".\\ 
-При определении переменных **не используйте пробелы**.\\ 
-Конкатенация строк происходит без дополнительных символов: **Val1+="_"Val2**. 
- 
-==== Встроенные переменные ==== 
-  * **$BASH** - путь к исполняемому файлу bash. 
-  * **$GROUPS** - группы пользователя. 
-  * **$HOME ** - домашний каталог. 
-  * **$HOSTNAME ** - сетевое имя хоста. 
-  * **$SHLVL ** - уровень вложенности shell. 
-  * **$SECONDS** - время работы скрипта. 
-  * **$REPLY** - для ввода read, по умолчанию. 
- 
-===== Условный оператор ===== 
-Проверяет, является ли результат **0 (истина)**.\\ 
-Условие условие проверяется с помощью команды [[main:linux:bash:утилита_test|test]], на данный момент, команда **является встроенной** т.е. не вызывает аналогичную утилиту.\\ 
-Условия можно указать следующими способами: 
-  * **if test -z $1** 
-  * **if /usr/bin/test -z $1** 
-  * **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</code> 
- 
-Оператор **if** можно и не использовать. 
-<code bash>[ -z $1 ] && echo result false 
-или 
-ping -c 1 8.8.8.8 &>/dev/null || echo not available 
-</code> 
- 
-==== Else if (elif) ==== 
-**elif** - краткая форма записи конструкции **else if**. 
-<code bash>if [ expr ]; then 
-  action 
-elif [ expr ]; then 
-  action 
-else 
-  action 
-fi 
-</code> 
- 
-===== Циклы ===== 
-==== for ==== 
-Обработка диапазонных значений.\\ 
-**for** условие **do** действие **done**. 
-<code bash> for (( i=100; i>1; 1-- )); do action; done </code> 
- 
-Внутри **((..)')** вычисляется арифметическое выражение и возвращается результат и позволяет работать с переменными в стиле С.\\ 
- 
-Так же, можно указать диапазон: 
-<code bash>for i in {100..104}; do action; done </code> 
-<code bash>for i in 100 101 102 103 104; do action; done </code> 
-<code bash>for i in $@; do action; done </code> 
-<code bash>numbers="1 2 3 4 5" 
-for i in `echo $numbers`; do action; done </code> 
- 
-==== while ==== 
-Выполняется пока условие истинно.\\ 
-**while** условие **do** действие **done**. 
-<code bash>while [ $v1 -le $v2 ] ; do action; done </code> 
-В двойных скобках символ **$** перед переменной можно опустить, так же, двойные скобки позволяют наращивать значение переменной **( (v+=1) )** 
-<code bash>while (( v1 <= v2 )') ; do action; done </code> 
- 
-==== Until ==== 
-Противоположно циклу **while**, выполняется пока условие ложно. 
-**until** условие **do** действие **done**. 
-Все остальное аналогично. 
- 
-===== case ===== 
-<code bash>case $v1 in 
-val1) 
-  action1;; 
-val2) 
-  action2;; 
-*) 
-  default action;; 
-esac 
-</code> 
- 
-===== Работа со строками ===== 
-**Длина строки:** 
-<code bash>echo ${#string} 
-echo `expr length $string` 
-</code> 
- 
-**Извлечение подстроки** 
-<code bash>${string:position} # вместо $string можно поставить * или @ 
-${string:position:length} 
-expr substr $string $position $length 
-</code> 
- 
-**Удаление части строки** 
-<code bash>${string#(##)substring} # Удаляет самую короткую (длинную), ищет с начала строки 
-${string%(%%)substring} # Удаляет самую короткую (длинную), ищет с конца строки 
-</code> 
- 
-**Замена подстроки** 
-<code bash>${string/substring/replacement} // Первое вхождение 
-${string//substring/replacement} // Все вхождения 
-</code> 
- 
-===== Отладка ===== 
-Для отладки, можно использовать команду **bash -x файл_скрипта**. 
- 
-===== Примеры ===== 
-**"Около-многопоточность"**\\ 
-Используется минимум два скрипта, в первом выполнение работы, второй в цикле запускает подоболочку в фоне, не дожидаясь окончания каждого. Ньюанс в том что в конце головной скрипт не закрывается сам, думаю можно исправить аргументами. 
-<code bash> for CurrAddr in {1..25}; do 
-./oneping $CurrAddr & # Там происходит просто пинг переданного адреса 
-done 
-# В итоге, ждем тайм-аут один раз, для всех хостов 
-</code> 
- 
- 
-===== Утилита test ===== 
- 
-Unix утилита для проверки типа файла и сравнения значений.\\ 
-Возвращает 0 (истина) или 1 (ложь). Выражения могут быть как унарными так и бинарными.\\ 
- 
-**Использование:** <code bash># test [expr]</code> 
-**Пример:** <code bash>if test -f file.txt или [ -f file.txt ] 
-then 
-  rm file.txt 
-else 
-  echo 'no found' 
-fi 
-</code>  
- 
-==== Параметры запуска ==== 
-  * **-d file** - если file существует и является директорией. 
-  * **-e file** - если file существует. 
-  * **-f file** - если file существует и является обычным файлом. 
-  * **-k file** - если file существует и ему установлен "sticky" бит. 
-  * **-L file** - если file существует и является символьной ссылкой. 
-  * **-r (-w/-x) file** - если file существует и читаем (записываем/исполняем). 
-  * **-z str** - если длина 0. 
-  * **-n str** - если длина не 0. 
-  * **-a (-o)** - аналог && (||) в одинарных скобках. 
-  * **str1 = ('!=') str2** - если строки равны (не равны). 
- 
  
linux/overall/bash/scripts.1620294198.txt.gz · Последнее изменение: 2021/05/06 09:43 — admin