Командный процессор bash

Программа bash (Bourne Again SHell) соответствует стандарту POSIX по 
операционным оболочкам, обеспечивает интерактивную работу с консолью и 
обработку командных файлов. Программы на bash можно 
запускать непосредственно, например, если prog.sh --- это 
командный файл, который разрешено исполнить текущему пользователю, то он 
исполнится после ввода prog.sh в командной строке. Можно исполнить и
командный файл, который пользователю нельзя исполнять, но можно читать 
(файлы с такими атрибутами защиты по умолчанию создаются текстовыми 
редакторами), явно вызывая bash, или, если возможно, устанавливая нужные
атрибуты защиты. Итак, если есть такой командный файл text.sh, то его можно 
исполнить 4-я способами.

  1) bash text.sh

  2) bash < text.sh

  3) chmod 755 text.sh; ./text.sh

  4) . text.sh

Способы 1--3 эквиваленты: они вызывают bash специально для исполнения 
text.sh, т.е. text.sh выполняется в подоболочке оболочки ОС. Последний 
способ исполняет команды из text.sh так, как если бы они в ручную строчка 
за строчкой вводились с консоли, т.е. в текущей оболочке.

      Определение терминов

Пропуск --- один или более знак пробела или табуляции.

Слово --- последовательность символов, рассматриваемая как единое целое.

Идентификатор --- как в си.

Разделитель --- нецитированный разделяет слова: пробел, табуляция и знаки 
| & ; ( ) < > .

Управляющий оператор --- слово, выполняющее функцию управления: маркер
конца строки и знаки | || & && ; ;; ( ).

Зарезервированные (служебные) слова --- нецитированные имеют специальное 
значение для оболочки, когда стоят в первой позиции простой команды, в 
третьей позиции команд case или for или в некоторых других случаях: 
! case do done elif else esac fi for function if in select then until while { }.

Код возврата --- значение, возвращаемое командой вызвавшей ее среде.

Встроенная команда --- команда, представленная не отдельным файлом, а
определенная в оболочке.

      Грамматика

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

(П) ls *.[ch]  #показ имен файлов текущего каталога с расширениями c или h
    echo A1 2B XY #печать слов A1 2B XY

Трубопровод (pipeline) --- последовательность одной и более команд, разделенных 
символом |. Формат трубопровода --- [!] <команда>  [| <следующая команда> ...].
Стандартный поток вывода команды в трубопроводе передается в стандартный 
поток ввода следующей команды. Эта передача устанавливается до 
перенаправлений, определяемых командами. Если служебное слово ! 
начинает трубопроводу, то код возврата трубопровода --- логическое НЕ кода 
возврата последней команды трубопровода, в противном случае код возврата --- 
это код возврата последней команды. Оболочка ждет окончания выполнения 
всех команд перед возвращением кода возврата.

(П) echo I am computer. | cat | wc

Список --- последовательность одного или более трубопроводов, разделенных одним
из операторов, ;, &, &&, ||, и завершающийся символом ; или & или переходом
на новую строку. Приоритет операций && и || или ; и & --- одинаков. Команда,
завершающаяся &, имеет код возврата 0. Код возврата списка --- это код
возврата последнего выполненного трубопроводе в нем. Операторы !, || и && 
называют операциями списочное НЕ, ИЛИ и И соответственно.

(П) echo 123 XYZ | wc || echo AB BC | cat  #1 2 8
    echo 123 XYZ | wc && echo AB BC | cat  #1 2 8// AB BC
    ! echo ok | cat && echo 123  #ok
    ! echo ok | cat ; echo 123  #ok// 123
    true || echo 2 || false && echo ok #ok

      Составные команды оболочки

(<список>) --- список выполняется в подоболочке, т.е. в оболочке,
вызванной текущей оболочкой. Присваивания переменным и другие воздействия на 
окружение оболочки не имеют эффекта после завершения выполнения списка. Код
возврата --- это код возврата списка.

(П) S=5; (S=7; echo $S); echo $S  #7// 5

{ <список>} --- группирование.

(П) S=5;{ S=7; echo $S;}; echo $S  #7// 7

for <идентификатор> [in <список слов>] do <список команд> done --- 
список слов после in раскрывается, генерируя список слов-значений для 
идентифицированной переменной. С каждым значением переменной выполняется 
список команд. Если раздел in явно отсутствует, то неявно используется 
in $@, т.е. слова-значения берутся последовательно из списка позиционных 
параметров.

(П) for i in 1 2 24
    do
      echo $i
    done #1// 2// 24

(П) for i in 1 2 24; do echo $i; done #то же самое

(П) for fn in *; do echo $fn; done #печать всех файлов текущего каталога

select <идентификатор> [in <список слов>] do <список команд> done ---
список слов после in раскрывается, генерируя список слов-значений, которые 
выводятся нумерованным списком в поток ошибок. Если раздел in явно 
отсутствует, то неявно используется in $@. Затем выводится приглашение PS3 и
ожидается ввод данных пользователем. Если введенная строка --- это 
число-позиция в выведенном списке, то идентифицированной переменной
присваивается слово-значение с этим номером. При вводе пустой строки запрос
повторяется. При вводе маркера конца файла (EOF, Ctrl-D) выполнение select
прекращается. При ином вводе переменной присваивается пустая строка.
Введенная строка сохраняется в переменной окружения REPLY. Список команд
выполняется после каждого ввода до выполнения команд break или return.
Код возврата --- это код возврата последней выполненной команды или 0, если
команды из списка не выполнялись. Средство для создания интерактивных
скриптов.

(П) echo What\'s the name breaks the order?
    select name in Ann Alexander Andrew Mary Julia
    do
      echo You\'ve inputted $REPLY 
      echo You\'ve selected $name
      break
    done

case <слово> in [<шаблон> [|<шаблон>] ... ) <список команд> ;; ] ...
esac --- слово раскрывается и затем
сопоставляется последовательно шаблонам. Если оно соответствует шаблону, то
выполняется список команд после него. После нахождения первого соответствия
дальнейшие сопоставления прекращаются. Шаблоны case строятся по тем же 
правилам, что и шаблоны имен файлов. Код возврата --- 0, если не подошел ни
один шаблон, или код возврата последней выполненной команды.

(П) case 5 in
      4 | 7) echo A;; #шаблон для 4 или 7 эквив. [47]
      6) echo B;;
      5) echo C;;
      *) echo ABC;; #шаблон, подходящий для всех
    esac #C

if <список команд> then <список команд> 
      [elif <список команд> then <список команд>] 
      ...
      [else <список команд>] fi --- список команд после if выполняется.
Если его код возврата --- 0, то выполняются команды после then. В противном
случае выполняются последовательно команды после elif до тех пор, 
пока код возврата выполненного списка не станет 0 и не выполнится список 
команд после соответствующего этому elif then. Список команд после else 
выполняется, если ни один список команд после then не был выполнен. Код
возврата --- это код возврата последней выполненной команды.

(П) if ls; then echo You can see your current directory contents above
    else echo You cannot see this message! ; fi

while <список команд> do <список команд> done --- пока код возврата 
выполняемого списка команд после while не станет отличным от 0, выполняется 
список команд после do. Код возврата --- это код возврата последней
выполненной команды после do или 0, если после do команды ни разу не
выполнялись. Выйти из цикла можно также командой break, выполненной после do.

(П) while ls; do echo ok.; done #infinite loop

until <список команд> do <список команд> done --- отличается от while
только инвертированием условия выхода из цикла.

(П) until echo Hello! ; do echo You can\'t see it! ; done

[function] <идентификатор> () { <список команд>} --- определяет функцию,
тело которой заключается между фигурными скобками. Вызов функции происходит
при вводе ее имени, т.е. также как и программы. Код возврата вызова функции
--- это код возврата последней выполненной команды ее тела.

(П) hello() { echo Hello;}
    hello #Hello

      Цитирование

Используется для отмены специального значения некоторых символов и 
символьных последовательностей (служебных слов), а также для предотвращения
раскрытия параметров.

Цитирование обеспечивается тремя способами: использованием ESCAPE-символа
(backslash, \), одиночными кавычками (апострофами), (двойными) кавычками.

Backslash отменяет специальное значение любого следующего за ним символа.

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

Кавычки действуют подобно апострофам, но не отменяют специального значения
4-х символов: !, $, ` и \.

      Параметры

Параметр хранит некоторое значение, именуется идентификатором, номером или
специальным символом. Переменные оболочки --- это параметры с идентификатором.

Переменным можно присваивать значения командой присваивания
<идентификатор>=<значение>.

В значении не производится раскрытие имен файлов.

Встроенная команда unset позволяет уничтожить переменную.

(П) V1='Hello, World!'
    V2=ok
    echo V1 V2 #V1 V2
    echo $V1 $V2 #Hello, World! ok
    V1=
    unset V2
    echo $V1 $V2

Переменной можно присвоить пустую строку, но это не уничтожит переменную.

Позиционный параметр именуется целым числом, большим нуля. Позиционные
параметры устанавливаются по аргументам вызванной команды и их нельзя
изменить присваиванием, но можно встроенной командой set. Если имя параметра
--- число, большее 9, то при обращении к параметру это число нужно заключать
в фигурные скобки.

(П) echo echo \$1 \${10} >testpp
    chmod 777 testpp #makes mytest executable
    ./testpp a b c d e f g h i j k #a j
    rm testpp

Специальные параметры именуются одиночными символами: *@#0$?_-!. Символы * 
и @ означают все позиционные параметры; если они берутся в кавычках, то *
все параметры объединяет в один, а @ --- нет. Символ # означает число 
позиционных параметров, 0 --- имя программы, $ --- номер текущей задачи 
(процесса), ? --- код возврата последнего выполненного трубопровода, _ --- 
последний параметр предыдущей команды после раскрытия.

(П) echo echo \$0 is process \\\# \$\$ >testsp
    chmod 750 testsp
    echo echo it has \$\# parameters: \$\* >>testsp
    ./testsp a b c d #testsp is process # <number>//it has 4 parameters:
      #a b c d
    rm testsp
    echo $? #0
    rm -f /bin/ls 2>/dev/null
    echo $? #1
    ! echo $? #0
    echo $? #1
    no_such_program 2>/dev/null
    echo $? #127

``Файл'' null из каталога /dev --- это устройство, уничтожающее любой 
поток, направленный в него. Конструкция 2>/dev/null уничтожает поток ошибок.

(П) Создаем файл testaa

      echo $*
      echo = $_
      echo "$*"
      echo = $_
      echo $@
      echo = $_  
      echo "$@"
      echo = $_  

Делаем его исполнимым и запускаем

      ./testaa a b

      Получим на печати

      a b
      = b
      a b
      = a b
      a b
      = b
      a b 
      = b

Символ ! означает номер последней запущенной параллельно задачи, символ -
--- список опций оболочки. Опции это параметры, начинающиеся с -, --- они 
задают режим работы программы. Опции оболочки устанавливаются командой set,  
при вызове оболочки или самой оболочкой. Некоторые опции подразумеваются и 
их не нужно задавать явно.

(П) sleep 1000&
    echo $!   #номер процесса для sleep
    echo $-   #himBH

Некоторые переменные устанавливаются оболочкой самостоятельно, например,
PWD --- текущий каталог, OLDPWD --- предыдущий текущий каталог, UID ---
номер текущего пользователя, RANDOM --- случайное целое число, SECONDS ---
количество секунд работы оболочки.

(П) echo $PWD $UID $SECONDS

Некоторые переменные устанавливаются и используются оболочкой, но 
пользователь может изменять их значения, например, IFS --- разделитель 
полей, PATH --- список каталогов, из которых могут быть вызваны программы, 
HOME --- рабочий каталог пользователя, PS1 --- приглашение оболочки, 
PS2 --- вторичное приглашение оболочки, HISTSIZE --- количество запоминаемых 
команд пользователя оболочки, т.е. размер истории команд.

(П) echo $PATH; echo $HOME; echo $HISTSIZE

      Раскрытие

Всего есть восемь видов раскрытий (порядок соответствует приоритету): 

1) фигурных скобок;

2) тильды;

3) параметров;

4) командной подстановки;

5) арифметическое;

6) подстановки процессов (проходит одновременно с предыдущими);

7) разделения слов;

8) имен файлов.

Раскрытие фигурных скобок происходит при встрече перечисленных через
запятые слов, заключенных в фигурные скобки. 

(П) echo a{1,22,x}d  #a1d a22d axd
    echo a{b,{c,d}}e  #abe ace ade
    ls ?{d,f}* #имена файлов текущего каталога, 2-я буква которых d или f

Знак тильды, за которым следует имя пользователя, означает домашний
каталог этого пользователя. Если строка после тильды неимя пользователя, то
раскрытия не происходит. Слово ~+ означает $PWD, ~- --- $OLDPWD, ~ --- $HOME.

(П) echo ~student ~+  #/home/student <текущий каталог>
    echo ~nosuchuser  #~nosuchuser
    cd ~  #вернуться в свой каталог

Чтобы получить значение параметра перед ним нужно поставить знак $.
Параметр можно (иногда необходимо) заключать в фигурные скобки.
(П) X=abc
    XY=123
    echo $XY ${X}Y #123 abcY

Кроме простого раскрытия параметры можно раскрывать следующими способами:

${<параметр>:-<слово>} --- если параметр не существует или пуст, то
значением этой конструкции будет раскрытие слова, иначе берется значение 
параметра (использование предопределенного значения);

${<параметр>:=<слово>} --- если параметр не существует или пуст, то его
значением становится раскрытие слова, которое и будет значением конструкции, 
иначе берется значение исходного параметра (присваивание предопределенного 
значения);

${<параметр>:?<слово>} --- если параметр не существует или пуст, то в
поток ошибок выводится раскрытие слова, иначе значением конструкции 
будет значение исходного параметра (показ ошибки при отсутствии значения
параметра);

${<параметр>:+<слово>} --- если параметр не существует или пуст, то
значением этой конструкции будет пусто, иначе берется раскрытие слова
(использование альтернативного значения);

${#<параметр>} --- длина в символах значения параметра;

${<параметр>#<слово>} 

${<параметр>##<слово>} --- слово раскрывается, производя шаблон имени
файла. Если шаблон соответствует началу значения параметра, то это начало
удаляется при раскрытии (в случае одного знака # --- кратчайшая часть, в 
случае двух --- наибольшая);

${<параметр>%<слово>} 

${<параметр>%%<слово>} --- отличается от предыдущей конструкции только
тем, что шаблон сопоставляется не началу, а концу значения параметра.

(П) X=abbbc
    Z=a*b
    W=
    echo ${W:-X} ${W:-$X}  #X abbbc
    echo ${W:=X} $W  #X X
    W=
    echo ${W:+1} ${X:+2}  #2
    echo ${#X} ${X#$Z} ${X##$Z} ${X%c}  #5 bbc c abbb
    echo ${W:?error} ok  #error, аварийный выход из сценария

${<параметр>/<заменяемое>/<замена>} --- замена, если заменяемое начинается с
/, то все вхождения заменяемого заменяются, иначе только первое.

(П) A=abccbgc; echo $A ${A/c/X} ${A//c/X}   #abccbgc abXcbgc abXXbgX

${<параметр>:<отступ>:<длина>} --- выделение подстроки, с позиции отступа
(нумерация с 0), заданной длины.  Длину можно не указывать, тогда берется
остаток строки.  Длина и отступ --- это арифметические выражения.  Если
отступ отрицателен, то берется отступ справа.  Если длина отрицательна, то
она уменьшает остаток.

(П) A=01234567; echo ${A:5} ${A:4+1:1} ${A:5: -1} ${A: -2} #567 5 56 67

${<параметр>^^} -- приведение к верхнему регистру.

${<параметр>,,} -- приведение к нижнему регистру.

${<параметр>~~} -- смена регистра.

Раскрытие замены команд позволяет заменить команду ее выводом. Для такого
раскрытия команду нужно заключать в грав-акценты или между $( и ).

(П) $(echo echo ok)  #ok
    echo `ls`  #содержимое текущего каталога

Для выполнения расчетов с целыми числами служит арифметическое 
раскрытие, которое происходит, если заключенное в двойные скобки 
выражение предварить знаком $. В выражениях можно использовать 
все операции языка си, включая присваивания, с теми же приоритетами 
и операцию возведения в степень, **, с высшим среди бинарных операций
приоритетом. 


(П) echo $((7+2*(6-2)))    #15
    A=$((5+6)); echo $(($A*5))  #55
    echo $(((7 ^ 1) - (7 || 1)))  #5

Подстановка процессов производится созданием специальных временных 
файлов-очередей в каталоге /dev/fd/, имена которых будут являться 
результатом раскрытия такой подстановки. Список команд для подстановки 
процессов заключается в скобки и предваряется знаком < для созданиия файла 
с содержимым из результата печати в стандартный поток списка команд или > 
для созданиия файла, запись в который производит стандартного поток ввода 
для списка команд. Позволяет избежать явного создания временных файлов.

(П) echo <(echo 1) #/dev/fd/ЧИСЛО
    cat <(cat data.txt) #cat data.txt
    cat <(echo -n 1) <(echo 2) #12
    echo 1234 > >(cat) #1234
    cat < <(echo 23) > >(cat) #23

Слова разделяются, как правило, по знакам пробела, табуляции и перехода 
на новую строку (это стандартное значение переменной среды IFS).

(П) X="a bb ccc dddd"
    echo $X | wc  #1 4 14

Раскрытие имен файлов происходит при встрече знаков *, ? или множеств, 
задаваемых в квадратных скобках.

(П) ls ?[a-zA-Z]*  #показ имен файлов, 2-й символ которых, --- анг. буква
    ls ?[^a-zA-Z]*  #второй символ -- неанглийская буква
    echo *  #показ всех имен файлов текущего каталога

      Перенаправление потоков ввода-вывода

Поток ввода n (по умолчанию --- 0), в общем случае, перенаправляется из 
файла конструкцией n< <имя файла>. Поток вывода n (по умолчанию --- 1) --- в 
файл конструкцией n> <имя файла>. Одновременно связать поток n с одним файлом 
для ввода и вывода можно конструкцией n<> <имя файла>. Добавить данные 
из потока n (по умолчанию --- 1) к файлу можно конструкцией n>> <имя файла>. 
Имя файла раскрывается. 

Брать данные для потока ввода n (по умолчанию --- 0) из самого командного 
файла можно, используя конструкцию ``здесь документ'', заключая данные между 
одинаковыми маркерами -- финальная строка должна совпадать с маркером после
перенаправления.

n<< СЛОВО-МАРКЕР 
текстовые данные
РАЗДЕЛИТЕЛЬ

Если всё слово-маркер или его часть цитируется, то строки данных не 
раскрываются и завершающий маркер-разделитель -- это результат отбрасывания 
цитирования в слове. Слово-маркер не раскрывается по видам раскрытия 
3--5 и 8, а строки данных до разделителя раскрываются по видам 3--5. 

(П) cat <<END
    1st
    2nd
    END
    #напечатает 1st// 2nd

Можно начинать конструкцию строкой n<<- СЛОВО-МАРКЕР, в этом случае 
игнорируются начинающие строки данных и финальную строку табуляции.

Для однострочных данных можно использовать перенаправление n<<<СЛОВО -- слово 
раскрывается и передается в поток ввода n.

(П) cat <<< Hello   #Hello, cat < <(echo Hello)

Направить поток вывода n (по умолчанию --- 1) в поток m можно 
перенаправлением n>&m, например, >&2 направит стандартный поток 
вывода в поток ошибок, а конструкция 2>&1 объединит потоки стандартный 
и ошибок в стандартый поток. Конструкция с & должна быть после всех 
перенаправлений. Аналогичным образом можно перенаправлять и поток ввода.

(П) ls /bin /xyz * >out1  #распечатка содержимого каталогов /bin и /xyz
    ls /bin /xyz * 2>out2
    ls /bin /xyz * >out3 2>&1  #проанализировать содержимое файлов out{1,2,3}

      Функции

Могут вызываться с любым числом параметров. Специальный параметр #,
при вызове функции становится равным числу ее параметров, при выходе из
функции он восстанавливает свое значение вместе со значениями позиционных
параметров среды вызова. Параметр 0 в функции не меняется. Функция и вызвавшая 
ее среда разделяют переменные. Если функции нужны локальные переменные, то их 
нужно описать в ее теле после встроенной команды local. Выход из функции
осуществляется либо после выполнения последней команды в ее теле, либо по
встроенной команде return, после которой можно указать число-код возврата. 
Функции могут быть рекурсивными.

(П) lsx () { ls -l;}
    lsx  #так же как и ls -l
    snoa () { echo $#;}
    snoa 1 3 5 A #4
    sumcalc () {  #выводит сумму аргументов
      local sum=0 i
      for i in $@
      do
        sum=$(($sum+$i))
      done
      echo $sum
    }
    sumcalc 111 22 77 4 #214
    fact () {  #факториал, до 14/20
      case $1 in
        [01]) echo 1;;
        *) echo $(($1*$(fact $(($1-1)))));;
      esac
    }
    fact 7  #5040
    fact 0  #1

      Управление задачами, сигналы, окружение

Если запустить задачу параллельно, то bash напечатает ее идентификационный
и порядковый номера, а также сообщит потом о завершении ее выполнения.
Выполняющуюся в оболочке задачу можно приостановить нажатием сочетания клавиш 
Control-Z. Приостановленную задачу можно продолжить либо параллельно 
выполнению оболочки встроенной командой bg, либо в самой оболочке --- fg. 
Нажатие сочетания клавиш Control-C прекращает выполнение текущей задачи 
оболочки.

(П) sleep 700
    #press Control-Z
    bg  #получился перевод задачи в фоновый режим

Сигнал --- это механизм, которым обеспечивается передача сообщения от ядра
ОС к задаче о событии, случившемся в системе. При прекращении выполнения
задачи по сигналу ее код возврата равен 128+<номер сигнала>, при
``естественном'' прекращении --- код возврата всегда меньше 128.

(П)  sleep 10000
     #нажмите Control-C
     echo $?  #130, т.е. задача прекращена по сигналу с номером 2       

Набор параметров оболочки называется ее окружением или средой (environment).
Среду можно распечатать встроенной командой set. При
вызове копии оболочки, новая оболочка наследует
окружение вызвавшей ее оболочки, которое специфицируется
встроенной командой export. Выход из оболочки можно произвести по
встроенной команде exit или по нажатию сочетания клавиш Control-D. 

(П) A=77
    echo 'echo ${A:-nosuch}; A=52' >ttt
    bash ttt  #nosuch
    echo $A   #77
    export A
    bash ttt  #77
    echo $A	#77
    rm ttt

      История команд

Некоторые полезные ссылки на историю команд:

!<строка> --- на последнюю команду, начинающуюся с данной строки;

!?<строка>? --- на последнюю команду, содержащую данную строку;

!-<номер> --- на предшествующую команду с заданным номером (нумерация с 
конца);

!! --- предшествующая команда, то же, что и !-1.

После ссылки через двоеточие можно указывать модификаторы, например,
s/<замещаемая строка>/<заменитель>/ заменяет в модифицируемой команде первое
вхождение замещаемой строки на заменитель. В заменителе можно использовать
символ & для ссылки на заменяемую строку. Если перед s поставить g, то
замена будет глобальной (по всей строке).

(П) echo ABCB   #ABCB
    echo 2222   #2222
    !!          #2222
    !-3         #ABCB
    !!:s/B/&A/  #ABACB
    !!:gs/B/x/  #AxACx
    !?BCB?      #ABCB

      Некоторые встроенные команды оболочки

bg 

break [<уровень вложенности>] --- выход из циклов for, select, while или until
с заданного уровня (по умолчанию 1, т.е. текущего). Если задан уровень
вложенности больше существующего, то уровень берется наибольшим возможным.

(П) for i in 1 2 3
    do
      for j in 4 5 6
      do
        echo $i $j
        break 2
        echo ok
      done
    done  #1 4

cd

continue [<уровень вложенности>] --- возобновление цикла for, while или
until с заданного уровня (по умолчанию 1, т.е. текущего). Если задан уровень
вложенности больше существующего, то уровень берется наибольшим возможным.

(П) for i in 1 2 3
    do
      echo $i
      continue
      echo ok
    done  #1// 2// 3

(П) for i in 1 2 3
    do
      for j in 4 5 6
      do
        echo $i $j
        continue 2
        echo ok
      done
    done  #1 4// 2 4// 3 4

echo --- опция -n подавляет автоматический переход на новую строку. Опция -e 
позволяет использовать escape-последовательности как в си (\n, \t, \\, ...), а
также \c -- маркер конца вывода.

(П) echo 1; echo 2  #1// 2
    echo -n 1; echo 2  #12
    echo -e '\n\\ok\\' #пустая строка и \ok\

exit [<код возврата>]

export

false

fg

help [<шаблон>] --- информация по встроенным командам.

(П) help | less  #краткая справка по всем командам
    help 'h*'  #справка по командам, начинающимся с h

jobs --- выводит список приостановленных и выполняющихся задач.

kill

let --- вычислить одно или более выражений с си-синтаксисом

(П) let a=5 a+=2*3
    echo $a   #11

local

logout --- выход во вход в систему для пользователя (login).

pwd --- то же, что и echo $PWD, т.е. печать текущего каталога.

read <идентификатор> ... <идентификатор> --- читает строку слов с входного
потока: 1-ой идентифицированной переменной присваивается 1-е слово, 
2-й --- 2-е и т.д. Если идентификатор не указан, то вся введенная строка
присваивается переменной REPLY.

(П) echo Введите через пробел Ваши фамилию и имя
    read surname name
    echo ok
    echo Ваше имя - $name
    echo Ваша фамилия - $surname

readonly [-f] <список идентификаторов> --- делает идентифицированные
переменные или после опции -f функции непереопределяемыми.

(П) A=7; B=9
    readonly B
    A=8; B=10
    echo $A $B  #8 9

return

set

shift [<количество сдвигов>] --- сдвигает позиционные параметры на
заданное число раз (1 --- по умолчанию).

(П) echo 'echo $1 $2; shift; echo $1 $2' >ttt
    bash ttt A B C  #A B// B C

test <выражение> 
[ <выражение> ] --- возвращает код возврата 0 (истина) или 1 (ложь),
совпадающий со значением вычисляемого логического выражения. Следующие
логические выражения истинны, если существует с таким именем:

    -d <имя> --- каталог;
    -e <имя> --- файл или каталог;
    -f <имя> --- файл;
    -L <имя> --- символический соединитель;
    -r <имя> --- файл и его можно читать;
    -s <имя> --- файл, размером больше 0;
    -w <имя> --- файл и в него можно писать;
    -x <имя> --- файл и его можно исполнить;
    -O <имя> --- файл и его владелец --- текущий пользователь;
    -G <имя> --- файл и его группа --- текущая.

Следующие логические выражения истинны, если:

    <имя> -nt <имя> --- файл с 1-м именем новее 2-го;
    <имя> -ot <имя> --- файл с 1-м именем старее 2-го;
    -z <строка> --- длина строки --- 0;
    -n <строка> --- длина строки больше 0;
    <строка1> = <строка2> --- строки 1 и 2 равны;
    <строка1> != <строка2> --- строки 1 и 2 неравны;
    ! <выражение> --- выражение ложно;
    <выражение> -a <выражение> --- оба выражения истинны (and);
    <выражение> -o <выражение> --- хотя бы одно из выражений истинно (or);
    <выражение> <операция> <выражение> --- операции --- это -eq (равно),
      -ne (неравно), -lt (меньше), -le (меньше или равно), -gt (больше),
      -ge (больше или равно). Выполняется сравнение значений арифметических
      выражений.

(П) if [ $[5*7] -le $[6*6] ]; then echo T; else echo F; fi #T
    if [ ABC = ABCD ]; then echo T; else echo F; fi #F
    if [ AB != AD -a -n XYZ ]; then echo T; else echo F; fi #T
    if [ -f /etc/fstab ]; then echo T; else echo F; fi #T
    if [ -O /etc/fstab ]; then echo T; else echo F; fi #F

(П) 
  fact () {
    [ $1 -lt 2 ] && echo 1 || echo $(($1*$(fact $(($1-1)))))
  }


time <команда> --- после завершения команды печатает врямя исполнения.

trap <команда> <именование сигнала> --- при поступлении заданного сигнала
выполняется команда.

(П) echo echo Press Control-C to break execution >ttt
    echo trap \"echo You\\\'ve pressed Control-C';' exit\" SIGINT >>ttt
    echo sleep 1000 >>ttt
    echo echo You\\\'ve waited 1000 seconds! >>ttt
    cat ttt
    bash ttt

true

ulimit информация по ресурсам системы, установка значений для ресурсов

unset

wait <номер процесса> --- оболочка ждет окончания выполнения процесса с
заданным номером. Обычно используется для синхронизации процессов.

(П) sleep 10 &
    wait $!