Различия

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


Предыдущая версия
bash [2025/07/06 12:38] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Руководство BASH ======
 +~~Title: Основы BASH скрипты, циклы, горячие клавиши ~~
 +{{htmlmetatags>
 +metatag-description=(Руководство Bash введение в оболочку, навигация, основные команды, переменные окружения, горячие клавиши (hotkeys).)
 +}}
  
 +{{ ::bash-shell.png?nolink&400 |}}
 +**bash** (Bourne again [[shell]]) - усовершенствованная и модернизированная вариация командной оболочки Bourne shell ([[sh|sh]]).
 +
 +===== Горячие клавиши Bash (hotkeys bash) =====
 +Таблица комбинаций клавиш консоли Bash (терминала Linux).
 +  * ctrl+d выйти из терминала
 +  * ctrl+l очистить экран, аналог команды clear.
 +  * ctrl+a переместить курсор в начало строки
 +  * ctrl+e переместить курсор в конец строки
 +  * ctrl+u удалить все символы от курсора до начала строки
 +  * ctrl+k удалить все символы от курсора до конца строки
 +  * ctrl+w удалить слово перед курсором
 +  * ctrl+b переместить курсор на один символ влево
 +  * ctrl+f переместить курсор на один символ вправо
 +  * ctrl+t поменять местами символ слева от курсора и под курсором
 +  * ctrl+h удалить символ слева от курсора
 +  * ctrl+p предыдущая команда в истории bash
 +  * ctrl+n следующая команда в истории bash
 +  * ctrl+r реверсивный поиск команд в истории bash
 +  * ctrl+y вставляет последнюю удалённую с помощью ctrl+u или ctrl+k строку
 +  * ctrl+m выполнение команды, аналог [Enter]
 +  * ctrl+o выполняет команду, при этом оставляя её в командной строке для дальнейшего использования
 +  * Tab+Tab выводит список команд. При наличии какого нибудь символа(-ов) выводит команды по введённым символам.
 +  * ctrl+c отменить последнюю введённую команду
 +  * ctrl+x+v показать версию bash
 +  * ctrl+s стоп режим. Блокирует вывод на консоль. При этом все данные отображённые на экране остаются неизменными.
 +  * ctrl+q выход из стоп-режима
 +
 +==== Конфигурационные файлы инициализации Bash ====
 +
 +Когда Bash вызывается как интерактивная оболочка, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в данном порядке: ~/.bash_profile, ~/.bash_login, и ~/.profile, читает и вызывает команды из них. При выходе Bash читает и выполняет команды из файла ~/.bash_logout. Также Bash использует команды из файла ~/.bashrc. Это может быть отменено опцией --norc. Опция --rcfile заставит Bash использовать команды из ~/.bashrc
 +
 +**Синтаксис**.
 +  * **Оператор точка** позволяет включать код находящийся в другом файле (после точки и перед именем загружаемого файла ставится пробел). Этот оператор часто используют для включения конфигурационных параметров, находящихся во внешних файлах.
 +  * **Двойные кавычки** - экранирует пробелы в значении переменных, например **echo "This UID=$UID"**. Знак $ и обратные кавычки (``), заключенные в двойные кавычки, сохраняют свойства специальных символов.
 +  * **Одинарные кавычки** экранируют все специальные символы. Т.е. символ $ в **echo '$sym '**не будет интерпретироваться как специальный символ, а выведется как текст.
 +  * **Обратные одинарные кавычки ``** служат для подстановки данных. В том месте где будет использована подстановка, будет подставляться то, что программа вывела бы на стандартный вывод. Вместо кавычек можно использовать круглые скобки со знаком $. Ниже команды идентичны: <file>
 +`date`
 +$(date)
 +</file>
 +  * **Символ ;** Оболочка bash допускает последовательное выполнение команд - одна за другой. Для этого серия команд вводится одной строкой, и разделяется символом ;. В этом случае сначала выполняется команда 1, по ее завершении команда 2 и т.д. Например<file>
 +$ cd ~; ls *.txt; cp *.txt $HOME/temp/
 +</file>
 +  * **Свойства переменных** в shell script:
 +        * не типизированы (значения в переменных считаются строками, и только если переменная будет использоваться в математическом выражении, будет происходить проверка типа переменной),
 +        * область видимости переменных - весь код программы (если переменная будет определена в функции, она все равно будет глобальной переменной и к ней можно будет обращаться из любого места программы),
 +        * при обращении к неопределенной переменной не выдаются ошибки,
 +        * регистрозависимые.
 +  * **echo и метасимволы в bash**. Для использования метасимволов \n (перевод на новую строку), \t и других в команде echo может потребоваться использование ключа -e двух символов обратного слеша или же можно использовать конструкции $'\X', ниже команды идентичны по результату свой работы:<file>
 +#!/bin/bash
 +
 +echo -e \\n\\tfirst
 +echo $'\n\t'second
 +</file>
 +===== Настройка переменных среды bash =====
 +<note important>Введите команду **export** и два раза нажмите клавишу Таb, получим список переменных в этом сеансе bash, которые можно изменить или просмотреть командой **echo**.</note>
 +
 +  * [[openvz?&#kak_vkljuchit_v_ve_openvz_zapis_istorii_komand_bash|Как включить в VE OpenVZ запись истории команд bash?]]
 +  * Вывести переменные окружения.<file>
 +$ env | more
 +SSH_AGENT_PID=1326
 +TERM=xterm
 +SHELL=/bin/bash
 +...
 +$ echo $PATH
 +/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
 +</file>
 +  * **export** - добавить переменную окружения pp=1. С помощью команды export присваивается переменной окружения определённое значение. Если переменная не существует, она будет немедленно создана. Если переменная уже имеет какое-то значение, оно будет потеряно.<file>
 +# export pp=1
 +</file>
 +  * unset - удалить переменную окружения pp<file>
 +# unset pp
 +</file>Чтобы старое значение переменой не терялось, например нужно добавить в переменную PATH новый каталог, нужно использовать такую конструкцию:<file>
 +$ export PATH=$PATH:/ваш/новый/каталог
 +</file>
 +  * Временно изменить редактор по умолчанию vi на nano<file>
 +# export EDITOR=nano
 +</file>Для постоянного применения нового редактора, нужно добавить в строку файл $HOME/.bashrc<file>
 +# nano .bashrc
 +
 +# set default editor nano
 +export EDITOR="nano"
 +# OR
 +# set default editor vi
 +#export EDITOR="vi"
 +</file>
 +===== .bash_aliases =====
 +  * Примеры для .bash_aliases<file>
 +$ nano $HOME/.bash_aliases
 +</file>Для применения изменений выполните команду<file>
 +$ source $HOME/.bash_aliases
 +</file>
 +  * Навигация<file>
 +alias ..='cd ..'
 +alias ...='cd ../..'
 +alias cdt='cd $HOME/temp; ls -l'
 +</file>
 +===== Как очистить историю команд в bash =====
 +Чтобы очистить историю команд в Bash, вы можете использовать следующие шаги:
 +<file bash>
 +cat /dev/null > ~/.bash_history
 +или
 +rm ~/.bash_history
 +
 +history -cw
 +</file>
 +
 +  * -c - Очистить файл истории
 +  * -w - Внести команды текущей сессии в файл с историей
 +  * d - Удалить строку с указанным номером из истории <file bash>
 +history -dw 352
 +</file>
 +  * Выполнить команду не занося ее в историю Bash <file bash>
 +$ <пробел>команда
 +</file>
 +  - **Очистить текущую сессию истории**: Вы можете ввести команду history -c. Это удалит все записи из истории текущей сессии, но НЕ затронет файл истории, хранящийся на диске.
 +  - **Удалить файл истории**: История команд Bash обычно сохраняется в файле .bash_history в домашнем каталоге пользователя. Чтобы полностью очистить историю, можно удалить этот файл, используя команду rm ~/.bash_history. После удаления файла истории можно начать новую сессию истории, закрыв и снова открыв терминал.
 +  - **Ограничение хранения истории**: Если вы хотите ограничить количество команд, сохраняемых в истории, вы можете установить переменные HISTSIZE и HISTFILESIZE в вашем файле .bashrc или .bash_profile. Например, export HISTSIZE=1000 будет хранить только последние 1000 команд.
 +
 +После внесения изменений, возможно, потребуется перезапустить терминал или перезагрузить конфигурацию, выполнив
 +<file bash>
 +source ~/.bashrc
 +</file>
 +===== Цветной терминал (консоль) в Linux =====
 +
 +В Debian 8 достаточно для root раскоментировать строки в /root/.bashrc<file bash>
 +# You may uncomment the following lines if you want `ls' to be colorized:
 +export LS_OPTIONS='--color=auto'
 +eval "`dircolors`"
 +alias ls='ls $LS_OPTIONS'
 +alias ll='ls $LS_OPTIONS -l'
 +alias l='ls $LS_OPTIONS -lA'
 +</file>Для пользовательской консоли включить force_color_prompt=yes в файле /home/<username>/.bashrc
 +
 +====== Позиционные переменные (параметры запуска скрипта) ======
 +При вызове команды или сценария с аргументами, имя команды и её аргументы являются позиционными переменными. Позиционными они называются, потому что внутри сценария  обращение к ним происходит по позиции в командной строке.
 +  * $0 ... $9 - при запуске допускается не более 9 параметров передавать в скрипт. Переменная $0 является именем скрипта и путь к скрипту. Для получения только имени скрипта смотрите код ниже:
 +<file bash>
 +#!/bin/bash
 +
 +echo
 +echo "# arguments called with ---->  ${@}     "
 +echo "# \$1 ---------------------->  $1       "
 +echo "# \$2 ---------------------->  $2       "
 +echo "# path to me --------------->  ${0}     "
 +echo "# parent path -------------->  ${0%/*}  "
 +echo "# my name ------------------>  ${0##*/} "
 +echo
 +exit
 +</file> 
 +  * **$#** - количество параметров переданных скрипту
 +  * **$?** - код возврата программы. **echo $?** - вывести ошибку с которой закончил выполняться предыдущий скрипт (программа), например, выведет 0 (true) если имя пользователя root<file>
 +test "root" = "$USER" ; echo $?
 +</file>
 +  * **$* и $@** - все параметры командной строки. **echo $*** - выведет все значения параметров.
 +  * **$!** - PID программы, запущенной в background режиме.
 +  * **$$** - PID процесса shell.
 +
 +
 +
 +====== Отладка скриптов bash ======
 +
 +Для отладки скриптов bash можно использовать встроенный набор команд. Можно включать и выключать режим отладки используя следующие команды внутри скрипта:
 +  * set -x - (set -o xtrace) показывать команды и параметры, которые выполняются;
 +  * set -v - (set -o verbose) печатает входные строки сразу по мере их считывания;
 +  * set -f - (set -o noglob) отключается генерация имени файла с помощью метасимволов (подстановка).
 +В одном и том же скрипте вы можете включать и выключать отладочный режим столько раз, сколько это необходимо. Символ "-" используется для активации параметра командной оболочки, а символ "+" - для его деактивации.
 +
 +**Пример**. Отладка прервется после первого выполнения цикла, что будет видно в результате выполнения этого скрипта.
 +<file>
 +#!/bin/bash
 +clear
 +
 +# включаем режим отладки
 +set -x
 +for i in 0 1 2 3 4
 +do
 +echo "Console number is $i" 
 +# выключаем режим отладки
 +set +x
 +done
 +
 +exit 0
 +
 +</file>
 +====== Массивы bash ======
 +<file bash>
 +#!/bin/bash
 +car=(bmw mers lada audi)
 +
 +# вывести второй элемент массива
 +echo ${car[1]}
 +# вывести все элементы массива
 +echo ${car[*]}
 +</file>
 +Вывести список директорий для бэкапа из массива bash:
 +<file bash>
 +BACKUP_LST=(
 +/etc
 +/root
 +/var/www)
 +
 +for k in ${BACKUP_LST[*]};
 +do
 +echo $k
 +done
 +</file>
 +
 +====== Взаимодействие с пользователем ======
 +===== read =====
 +При выполнении оператора read, на экране терминала появится курсор и пользователю даётся возможность ввести данные. Ввод завершается нажатием на кнопку "Enter". Если оператор read вызывать без указания переменной, он все данные, введенные пользователем, поместит в переменную по умолчанию - REPLAY.
 +<file>
 +#!/bin/bash
 +
 +echo -n 'Введите данные и нажмите "Enter" :'
 +read
 +echo "Вы набрали - $REPLY"
 +</file>
 +===== select =====
 +Команда select используется для создания интерактивного меню вашего скрипта. Синтаксис команды select (можно применять утилиту [[tput]]):
 +<file>
 + select variable [in list]
 + do
 + команды;
 + done
 +</file>
 +Список слов, следующих за in, расширяется, генерируя список элементов. Если в операторе select список in list не задан, то в качестве списка будет использоваться список аргументов ($@), передаваемый сценарию или функции.
 +
 +**Пример 1**. **~/.b*** выводится список файлов текущие директории начинающиеся на .b Из них формируется меню.
 +<code bash>
 +#!/bin/bash
 +
 +select file in ~/.b*  quit
 +do
 +if [ -e $file ]
 +then
 + ls -l $file
 +else
 + break
 +fi
 +done
 +
 +exit 0
 +</code>
 +**Пример 2**
 +<code bash>
 +#!/bin/bash
 +options1="\"option 1\" \"option 2\" \"quit\""
 +
 +echo options1 $options1
 +
 +eval set $options1
 +select opt in "$@"
 +do
 +echo $opt
 +if [ "$opt"="quit" ]; then
 +        exit
 +fi
 +done
 +</code>
 +**Пример 3**
 +<code bash>
 +#!/bin/bash
 +OPTIONS="Hello Quit"
 +           select opt in $OPTIONS; do
 +               if [ "$opt" = "Quit" ]; then
 +                echo done
 +                exit
 +               elif [ "$opt" = "Hello" ]; then
 +echo Hello World
 +echo `/bin/ls /`
 +               else
 +                clear
 +                echo bad option
 +               fi
 +done
 +</code>
 +====== Команда test ("[ ]") ======
 +Команда **test** предназначена для проверки следующих типов условий:
 +  - сравнение различных значений,
 +  - проверка типов и наличия файлов,
 +  - проверка логических условий (логическое И - "&&", и логическое ИЛИ - "||").
 +С использованием этой команды формируются операторы выбора и цикла языка [[shell]]. Два возможных формата команды:<file>test условие или [ условие ]
 +</file> удобней пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово "test", будем заключать условие в скобки, что более привычно для программистов. Например<file>[ "root" = "$USER" ]; echo $?
 +</file>вместо<file>test "root" = "$USER" ; echo $?</file>На самом деле shell будет распознавать эту команду по открывающей скобке "[", как слову, соответствующему команде "test". Уже этого достаточно, чтобы предупредить о распространенной ошибке начинающих: <note tip>Между скобками и содержащимся в них условием обязательно должны быть пробелы.</note>
 +^[ -e /путь к / файлу ]|- истина если файл существует|
 +^[ -s /путь к / файлу ]|- истина если файл существует и имеет не нулевую длину|
 +^[ -f /путь к / файлу ]|- истина если обычный файл существует|
 +^[ -h /путь к / файлу ]|- истина если файл существует и является символической ссылкой|
 +^[ -w /путь к / файлу ]|- истина если файл существует и и доступен для записи|
 +^[ -z STRING ]|- истина, если длина строки "STRING" равна нулю|
 +^[ -n STRING ] или [ STRING ]|- истина, если длина строки "STRING" ненулевая|
 +^[ STRING1 == STRING2 ]|- истина, если строки равны; для более строгого соответствия POSIX вместо "==" можно использовать "="|
 +^[ STRING1 != STRING2 ]|- истина, если строки не равны|
 +^[ STRING1 < STRING2 ]|- истина, если в текущей локали при лексикографической сортировке "STRING1" оказывается перед "STRING2"|
 +^[ STRING1 > STRING2 ]|- истина, если в текущей локали при лексикографической сортировке "STRING1" оказывается после "STRING2"|
 +^[ ARG1 OP ARG2 ]|"OP" - один из операторов -eq, -ne, -lt, -le, -gt или -ge. Эти арифметические двоичные операторы возвращают значение истина, если операнд "ARG1" соответственно равен, не равен, меньше, меньше или равен, больше или больше или равен операнду "ARG2". "ARG1" и "ARG2" являются целыми числами|
 +
 +
 +  * **Проверка логических условий**. Логическое И - "&&", и логическое ИЛИ - "||". Наиболее часто их применяют, когда необходимо проверить условие и, если оно истинно, выполнить одну команду или наоборот – не выполнять.
 +  - Пример №1<file>
 +[ -f file ] && rm file
 +</file>Поскольку проверяется логическое И, необходимо чтобы оба условия были истинной. И поэтому, если первое условие истина, то будет проверяться второе условие, т.е. будет вызвана программа rm.
 +  - Пример №2<file>
 +[ -f file ] || touch file
 +</file>В этом примере проверяется наличие файла file. Если его не существует (первое условие ЛОЖЬ), вызывается программа touch, которая его создает. Для того что бы получилась ИСТИНА, хотя бы одно из условий должно возвратить значение ИСТИНА. Поэтому, если файл существует (ИСТИНА), программа touch не будет вызываться, так как нет необходимости в проверки второго условия. Если файл не существует (ЛОЖЬ), необходимо проверить второе условие – будет выполнена программа touch.
 +
 +====== if-then-else ======
 +Набор управляющих операторов Bash включает в себя:if, while, until, for и case. Каждый из этих операторов является
 +парным, то есть начинается он одним тегом и заканчивается другим. Например, если условный оператор if начинается с if и заканчивается fi. Управляющие операторы — это не отдельные программы в системе, они встроены в bash.
 +
 +
 +Элементарная конструкция if выглядит так:
 +<file bash>
 +if [ "foo" = "foo" ]
 +then
 +# выполнить если выражение вычислилось как истина
 +fi
 +</file>
 +
 +if проверяет код возврата выполнения программы: 0- выполнено, любая цифра отличная от нуля - программа не выполнилась.
 +<file bash>
 +#!/bin/bash
 +
 +pwd="/root"
 +if rm $pwd/1.txt 2>/dev/null
 +then
 +echo "$pwd/1txt deleted"
 +else
 +echo "not deleted"
 +fi
 +</file>
 +Более короткая запись. <note>Если в качестве условия оператора if используется выражение, помещенное в квадратные скобки, для разрешения этого условия будет вызвана программа **test**. If будет проверять код возврата программы test
 +</note>
 +<file bash>
 +#!/bin/bash
 +
 +pwd="/root"
 +
 +[ -e $pwd/1.txt ] && (rm $pwd/1.txt; echo "Deleted")
 +</file>
 +  * Пример.<file bash>
 +#!/bin/bash
 +
 +CDIR=`pwd`
 +LDIR="/scripts"
 +
 +if !([ -h $LDIR ]); then
 +echo "Если символической ссылки на каталог запуска не существует - создать"
 +ln -s $CDIR $LDIR
 +#    exit 0
 +fi
 +</file>
 +  * Пример.<file bash>
 +if [[ "$B" = "Q" ]] #сравнение строк, обратите внимание на пробелы и скобки
 +then
 +#команды тут
 +fi #конец сравнения
 +
 +if [[ "$B" -eq 3 ]] #сравнение чисел
 +then
 +#команды
 +fi #конец сравнения
 +</file>
 +
 +====== Циклы bash ======
 +В этом разделе поговорим об управляющих конструкциях оболочки bash, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for, while и until, о методах работы с ними и о практических примерах их применения.
 +===== Цикл for in =====
 +Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение в списке поочерёдно присваивается переменной.
 +Синтаксис следующий:
 +<file bash>
 +for переменная in [список_значений]
 +do
 +команды
 +done
 +
 +for NAME [in LIST ]; do COMMANDS; done # синтаксис для записи цикла в одну строку
 +</file>
 +<note>Если ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.<file bash>
 +for arg in [list] ; do
 +</file></note>
 +Рассмотрим небольшой пример скрипта bash:
 +<file bash>
 +#!/bin/bash
 +for i in 0 1 2 3 4 # переменной $i будем поочерёдно присваивать значения от 0 до 4 включительно
 +do
 +echo "Number is $i"
 +done #цикл окончен
 +exit 0
 +</file>
 +В переменную $i поочерёдно подставляются значения из списка и в цикле идёт работа со значением этой переменной.
 +
 +<note>Элементы в списке могут разделяться символами пробела или табуляции. Если список не помещается на одну строку, его можно продолжить на следующей, но перед тем как нажать на Enter, поставьте символ "\" для экранирования значения символа перевода строки.</note>
 +
 +  * **Пример** получения данных из внешнего файла с фильтрацией содержимого файла. В нем сначала отбираются первые поля файла (разделение полей - пробел), а затем удаляются комментарии т.е. строки начинающиеся на символ "#".
 +<file bash>
 +#!/bin/bash
 +
 +for i in `cat ipset.txt | cut -f1 -d ' ' | sed -e '/^#/ d'`
 +do
 +echo "$i"
 +done
 +exit 0
 +</file>
 +  * Пример генерации списка команд на выполнение:
 +<file bash>
 +for k in `find /tmp/ -type f`; do echo ls -l $k ; done
 +</file>
 +  * Пример поиска файлов с исключением
 +<file bash>
 +for k in `grep -R vhosts-includes /etc/nginx/ | cut -d : -f1`; do  grep -w  "electroshemi"  $k && echo $k  ; done
 +</file>
 +===== Цикл while do =====
 +Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). В цикле while выполняются строки, расположенные между do и done, до тех пор, пока условие истинно или пока не встретится оператор break. Синтаксис оператора:
 +<file>
 +while выражение или команда возвращающая код возврата
 +do
 +команды
 +done
 +
 +while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку
 +</file>
 +
 +Пример работы цикла рассмотрим на следующем примере:
 +<file>
 +#!/bin/bash
 +again=yes #присваиваем значение "yes" переменной again
 +while [ "$again" = "yes" ] #Будем выполнять цикл, пока $again будет равно "yes"
 +do
 +echo "Please enter a name:"
 +read name
 +echo "The name you entered is $name"
 +
 +echo "Do you wish to continue?"
 +read again
 +done
 +echo "Bye-Bye"
 +</file>
 +Цикл выполняется до тех пор, пока мы не введем что-то отличное от "yes". Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле. Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.
 +
 +Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор "[" аналог команды test, которая проверяет истинность условия, которое ей передали.
 +
 +**Бесконечный цикл в bash при помощи while:**
 +
 +<file>
 +#!/bin/bash
 +while true; do
 +echo "Нажмите CTRL-C для выхода."
 +done
 +</file>
 +true — это тоже программа. Единственное, что она тут делает — это запускает тело цикла снова и снова. Использование true считается медленным, потому что ваш скрипт должен запускать ее раз за разом. Можно использовать альтернативный вариант:
 +<file bash>
 +#!/bin/bash
 +while :; do
 +echo "Нажмите CTRL-C для выхода."
 +done
 +</file>
 +Это позволяет добиться точно такого же эффекта, но быстрее, потому что «:» — это встроенная функция bash. Единственное отличие состоит в принесении в жертву читабельности кода. Используйте из приведенных вариантов тот, который вам нравится больше.
 +===== Цикл until do =====
 +Цикл until используется для выполнения заданного набора команд до тех пор, пока данное условие оценивается как ложное. Условие оценивается перед выполнением команд. Если условие оценивается как ложное, выполняются команды.
 +
 +Оператор until применяет способом аналогичным приведенному выше while. Разница лишь в том, что условие работает наоборот. Цикл while выполняет до тех пор пока условие истинно. Цикл until — до тех пор пока условие не станет истинным.
 +
 +Синтаксис <file bash>
 +until TEST-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку
 +</file>
 +
 +<file bash>
 +#!/bin/bash
 +
 +counter=0
 +
 +until [ $counter -gt 5 ]
 +do
 +  echo Counter: $counter
 +  ((counter++))
 +done
 +</file>
 +====== Оператор case ======
 +Оператор case всегда завершается ключевым словом esac.
 +<file>
 +case строка in
 +шаблон)
 +список операторов
 +;;
 +[ шаблон)
 +список операторов
 +[;;] ]
 +esac
 +</file>
 +Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами ";;". После выполнения всех строк управление передается  операторам, находящимся за ключевым словом esac.
 +
 +
 +====== Пустой оператор ======
 +Пустой оператор ":" . Ничего не делает. Возвращает значение "0".
 +====== Функции ======
 +Функцию в shell можно определить двумя способами: при помощи оператора function или после имени функции написать открывающую и закрывающую круглые скобки. Тело функции располагается между фигурными скобками.
 +
 +
 +====== eval ======
 +<file>
 +eval arg1 [arg2] ... [argN]
 +</file>
 +Транслирует список аргументов, из списка, в команды.
 +
 +Пример. Демонстрация команды eval
 +
 +<file>
 +#!/bin/bash
 +
 +y=`eval ls -l`  # Подобно y=`ls -l`
 +echo $y         # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.
 +echo
 +echo "$y"       # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.
 +
 +echo; echo
 +
 +y=`eval df`     # Аналогично y=`df`
 +echo $y         # но без символов перевода строки.
 +
 +#  Когда производится подавление вывода символов LF (перевод строки), то анализ
 +#+ результатов различными утилитами, такими как awk, можно сделать проще.
 +
 +exit 0
 +</file>
 +====== getopts ======
 +getopts - это встроенная в shell команда, позволяющая разобрать командную строку, передаваемую программе. Она понимает только параметры, написанные в стиле [[POSIX]], т.е "-v -t -f file" и т.п.
 +====== trap - обработка прерываний ======
 +Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:<file>
 +trap 'список команд' сигналы
 +</file>Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в "сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда "exit") управление вернется в точку прерывания и продолжится выполнение командного файла.
 +
 +Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:
 +<file>
 +0 выход из интерпретатора,
 +1 отбой (отключение удаленного абонента),
 +2 прерывание от <Del>,
 +9 уничтожение (не перехватывается),
 +15 окончание выполнения.
 +</file>
 +
 +Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой "trap":
 +
 +   trap 'rm /tmp/* ; exit 1' 1 2 15
 +
 +которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход "exit" из командного файла.
 +
 +Команда "trap" позволяет и просто игнорировать прерывания, если "список команд" пустой. Так например, если команда "cmd" выполняется очень долго, а пользователь решил отключиться от системы, то для продолжения выполнения этой команды можно написать, запустив команду в фоновом режиме:
 +
 +    ( trap '' 1; cmd )&
 +
 +
 +====== Примеры скриптов на Bash ======
 +  * [[telegram_api]]

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!