cmd файла. Пример 3 $ cat Вт июн 11 22:10:14 MSK 2019 Вт июн 11 22:11:45 MSK 2019 Пример 4 Встраиваемая строка. Представить текст заданного слова в качестве входных данных для указанной команды. $ cat <<<"Privet" Privet Пример 5 cmd <>file Записать в файл результат команды, содержимое файла не нарушается. $ date <> f30.txt; cat f30.txt Вт июн 11 21:58:17 MSK 2019 Вт июн 11 17:15:49 MSK 2019 cmd >| file Направить результат команды в файл переписав его содержимое. Пример 5 Направить результаты в файл, переписав его содержимое. $ date Пн 12 июл 2021 08:02:24 MSK $ cat >f30.txt Hello $ date >| f30.txt $ cat f30.txt Пн 12 июл 2021 08:03:13 MSK 2.9 Переадресация ввода-вывода с использованием дескрипторов файлов. Файловый дескриптор – целое число,которое указывает доступ к файлу. Стандартный ввод stdin дескриптор 0. Стандартный вывод stdout дескриптор 1. Стандартный вывод ошибок stderr дескриптор 2. Клавиатура stdin файл. Экран stdout файл. Файловый дескриптор привязан к индефикатору процесса. Пример # sleep 1000 & [2] 5021 # cd /proc/5021/fd ; ls 0 1 2 cmd >&n Направить результат команды в файл с дескриптором n. Пример 1 # дескриптор 1 стандартный вывод. $ date >&1 Вт июн 11 22:05:51 MSK 2019 cmd >&– Закрыть стандартный вывод $ date >&- date: ошибка записи: Неправильный дескриптор файла. cmd<&n Взять входные данные для указанной команды из файла с заданным дескриптором n. $ cat >file1<&0 privet $ cat file1 privet cmdm<&n Входные данные из файла с дескриптором m поступают из файла с дескриптором n. $ cat >file1 2<&0 privet 4 # Набираем с клавиатуры $ cat file1 privet 4 cmd<&– Закрыть стандартный ввод. $ pwd<&- /home/max1 $ cmd<&n Направить содержимое файла с заданным дескриптором n в стандартный ввод,получив сначала копию, а затем закрыв оригинал. cmd>&n- Направить содержимое файла с заданным дескриптором n в стандартный вывод,получив сначала копию,а затем закрыв оригинал. Пример Напишем следующий скрипт $ cat f2.sh #!/bin/sh read str <&0 echo "$str" | festival –tts –language russian Запускаем скрипт $ sh f2.sh Набираем в терминале фразу Привет друзья. Нажимаем Enter и слышим «Привет друзья» Пример 2 $ cat f5.txt Hello my friend $ read str Hello my friend Использование команды exec с дескрипторами. exec 0 Создадим под root myfile с двумя командами. # cat >myfile pwd; date Выполнить команды из файла вместо стандартного ввода. # exec 0 # pwd; date /root exec 1 cat myscript1.sh #!/bin/sh exec 1>outfile 0echo "This a test" $ cat ./outfile This is a test exec 3 $ cat myscript3.sh #!/bin/sh exec 3> myfile echo "Privet" >&3 cat ./myfile $sh myscript.sh Privet Примечание возможно использование команды exec c дескрипторами 0-9. 2.10 Многократная переадресация ввода-вывода. Направить стандартный вывод ошибок в заданный файл cmd 2>file Пример 1 $ ls -l /root/ 2>ls_er; cat ls_er ls: невозможно открыть каталог '/root/': Отказано в доступе. Направить стандартный вывод ошибок и данных в заданный файл. cmd >file 2>&1 Пример 2 $ ls -l f1.txt; ls -l /root/ 2>&1 >ls1 –rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt ls: невозможно открыть каталог '/root/': Отказано в доступе. $ cat ls1 ls: невозможно открыть каталог '/root/': Отказано в доступе. Присоединить стандартный вывод данных и ошибок к содержимому данного файла cmd&>> file Пример 3 $ ls -l f1.txt; ls -l /root/ &>> ls2 –rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt $ ls -l f1.txt; ls -l /root/ &>> ls2 –rw-rw-r– 1 max1 max1 6 мая 9 07:21 f1.txt max1@hp:~$ cat ls2 ls: невозможно открыть каталог '/root/': Отказано в доступе. ls: невозможно открыть каталог '/root/': Отказано в доступе. Направить стандартный данных в заданный file1, стандартный вывод ошибок в указанный file2 Направить стандартный вывод данных и ошибок в стандартный вывод, так и в заданные файлы. сmd 2 >&1 |tee файлы или cmd |& tee файлы Пример 4 $ pwd; ls -l /root/ 2>&1 |tee ls3 /home/max1 ls: невозможно открыть каталог '/root/': Отказано в доступе. $ cat ls3 ls: невозможно открыть каталог '/root/':Отказано в доступе. 2.11 Сохранение дескрипторов файлов в переменных. Допускается указывать имя переменной вместо числового обозначения дескриптора. Пример. Нахождение дескриптора файла. $ exec 4>file;echo "OK">&4; cat ./file OK max@hp:/dev/fd$ ls 0 1 2 255 4 max@hp:/dev/fd$ cat 4 OK Пример использования дескрипторов числом более 9 $ mv f1.txt f1 $ echo f1 {f1fd}>xyz f1 $ echo $f1fd 11 $ cd /dev/fd max@hp:/dev/fd$ ls 0 1 11 2 255 4 max@hp:/dev/fd$ echo "Privet">&11 max@hp:/dev/fd$ cat 11 Privet Дескриптор файла,сохраненный в переменной оболочки может быть использован в сценарии. 2.12 Специальные имена файлов. /dev/stdin Дубликат дескриптора файла 0 /dev/stdout Дубликат дескриптора файла 1 /dev/stderr Дубликат дескриптора файла 2 /dev/fd/ /dev/tcp/ Оболочка Bash устанавливает соединение с указанным хостом через заданный порт, используя полученный в итоге дескриптор файла при переадресации ввода-вывода. ~/Документы$ find -print >filelist 2>no_access Обнаруживаемые файлы направляются в файл filelist, а сообщения об ошибках в файл no_access Проверка ~/Документы$ cat filelist . ./Posix1.doc ./script ./script/sc01.sh ./no_access # новый файл ./rus2.doc ./filelist # новый файл ./otchet.doc Глава 3.Функции. Функция совокупность команд, выполняемых в сценарии оболочки. Синтаксис функции – имя { код-тело функции } [ виды переадресации] Обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции – ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" – код возврата. Функции вызываются таким же образом, как и команды. Если используется ключевое слово function,то указывать после имен необязательно Пример создания простой функции с именем privet. $ if [ "$USER"=max ]; then > privet { > echo "Privet Max";} > fi Запускаем функцию $ privet Результат Privet Max Характерно что функцию можно запускать многократно, результат будет тот же. Функция в скрипте. Функция fatal -выдать сообщение о неисправимой ошибке и прервать исполнение. Пример 2 Создадим простой скрипт c функцией fatal. $ cat >func1.sh #!/bin/sh fatal { echo "$0: fatal error:" "$@" >&2 exit 1 } if [ $# = 0 ] then fatal not enough arguments fi Проверка $ sh func1.sh func1.sh: fatal error: not enough arguments Пример 3 $ cat >myscript.sh #!/bin/bash function myfunc { read -p "Enter a value: " value echo "adding value" return $(( $value + 10 )) } myfunc echo "The new value is $?" Запускаем скрипт $ ./myscript.sh bash: ./myscript.sh: Отказано в доступе $ chmod +x myscript.sh $ ./myscript.sh Enter a value: 10 adding value The new value is 20 Пример 4 $ cat run.sh doSam { echo "magic" return 0 } if doSam;then echo "Its true" fi $ sh run.sh magic Its true В этом случае return 0 означает true, когда return 1 в традиционном булевом смысле означает false. Глава 4.Переменные. Переменные -это ячейка памяти,содержащаяся в себе определенные данные. Имена переменных не должны начинаться с цифры. 4.1 Присваивание значений переменным. Значения присваиваются переменным с помощью операции = Присваиваемое значение не должно отделяться пробелами от имени переменной. В одной строчке можно присвоить значение сразу нескольким переменным. $ firstname=Max lastname=Corn $ echo $firstname; echo $lastname Max Corn если значение по команде declare -i , то правая часть как вырражение $ i=3+5 ;echo $i 3+5 $ declare -i jj; jj=5+3; echo $jj 8 4.2 Подстановка переменных. Установить значение переменной,проверить. $ a=123; echo $a; 123 $ echo {$a} {123} $ echo {\$a}; {$a} echo {'$'$a} {$123} ${переменная} Использовать значение переменной для массивов. $ a=(0 1 2 ) $ echo ${a[1]} 1 ${переменная :-значение} Использовать переменную, если она указана, иначе – заданное значение. $ b=5 $ echo ${b:-10} 5 max@hp:~$ echo ${c:-10} 10 ${переменная :=значение} Использовать переменную,иначе заданное значение, присвоив его указанной переменной max@hp:~$ echo ${USER:=max2} max max@hp:~$ echo ${USER1:=max2} max2 ${переменная :?значение} Использовать указанное значение если она установлена, иначе выйти из оболочки. $ echo ${c:?125} bash: c: 125 ${переменная :+значение} Использовать указанное значение,иначе не использовать ничего. $ c=file1.txt $ echo ${c:+filen.txt} filen.txt $ echo ${d:+filen.txt} $ ${#переменная} Использовать длину указанной переменной. $ echo $c file1.txt $ echo ${#c} 9 $ ${#*},${#@} Использовать количество позиционных параметров. ${переменная #шаблон} Использовать после удаления слева теста ,совпадающего с шаблоном. Удалить самый короткий совпадающий фрагмент. c=file1.txt 1.txt ${переменная##шаблон} Удалить самый длинный совпадающий фрагмент $ echo ${c##file} 1.txt ${переменная ##шаблон} То же что и ранее ,короткий и длинный фрагмент справа. ${переменная %шаблон} ${переменная %%шаблон} $ echo ${c%.txt} file1 max@hp:~$ echo ${c%%txt} file1. ${переменная /шаблон/замена} $ data=`date` $ echo ${data} Чт июн 13 10:56:05 MSK 2019 $ echo ${data/Чт} июн 13 10:56:05 MSK 2019 ${переменная //шаблон/замена} $ echo ${data//Чт июн/Пт июль} Пт июль 13 10:56:05 MSK 2019 ${переменная /#шаблон/замена} ${переменная /%шаблон/замена} Использовать max@hp:~$ greeting="hello friend" $ declare -n message=greeting $ echo message message $ echo $message hello friend $ message="by now" $ echo $greeting by now $ {переменная@P} Вычислить значение указанной переменной. $ echo ${c@P} file1.txt $ $ {переменная@Q} Заключить в кавычки значение указанной переменной. $ c=file1.txt $ echo ${c@Q} 'file1.txt' ${!переменная } Использовать значение указанной переменной в качестве имени другой переменной ,значение которой должно быть использовано. 4.3 Косвенные переменные. Косвенные переменные-это переменные именующие другие переменные. Косвенные переменные создаются по команде declare -n Пример 1 $ greeting=privet $ echo $greeting privet $ declare -n message=greeting $ echo $message privet Пример 2 Присвоить через косвенную переменную значение основной переменной. $ message=otvet $ echo $greeting otvet Пример 3 Применение псевдонима $ text=ok $ echo $(!text) echo $(text=ok) 4.4 Переменные, встроенные в оболочку. Основные переменные. $# количество аргументов в командной строке. $-Действующие в настоящее время параметры,представленные в командной строке. $? Выходное значение последней,выполнявшейся команды. $$ Номер процесса ,присвоенный оболочке. $! Номер процесса,присвоенной команде,выполнявшейся в фоновом режиме. $0 Первое слово, имя команды. $n Oтдельные аргументы командной строки,если больше 9 форма ${n} $*,$@ Все аргументы командной строки ($1,$2..) Пример 1 $ cat >param.sh #!/bin/sh echo "$#" echo "$0" echo "$?" echo "$$" echo "$@" echo "$*" exit 0 Запускаем скрипт с параметрами a b c d $ sh param.sh a b c d 4 param.sh 0 2698 a b c d a b c d 4.5 Дополнительные переменные. $_ Временная переменная ,хранит последний аргумент предыдущей команды. Пример $ ls -l f2.txt –rw-rw-rw- 1 max1 max1 6 апр 24 12:57 f2.txt $ echo $_ f2.txt BASH Полный путь для вызова оболочки $ echo $BASH /usr/bin/bash BASHOPTS Доступный для чтения список активизированных в настоящий момент параметров оболочки. $ echo $BASHOPTS Checkwinsize:cmdhist:complete_fullquote: expand_aliases:extglob:extquote:force_fignore: globasciiranges:histappend:interactive_comments: progcomp:promptvars:sourcepath BASHPID Индефикатор текущего процесса. Пример $ echo $BASHPID 3321 Для сравнения используем встроенную переменную $ $$ 3321: команда не найдена BASH_COMMAND Команда,которая выполняется в текущий момент или готовится к исполнению. Это команда выполняемая при появлении прерывания MACHTYPE Тип машины $ echo $MACHTYPE x86_64-pc-linux-gnu UID Переменная реальный числовой индефикатор текущего пользователя mа1@hp:~$ echo $UID 1000 root@hp:~# echo $UID 0 EUID Переменная числовой действующий индефикатор текущего пользователя. $ echo $EUID 1000 GROUPS Переменная список числовых индефикаторов групп, членом которых является текущий пользователь. $ echo $GROUPS 1000 HISTCMD Номер текущей команды в предистории $ echo $HISTCMD 2021 HOSTNAME Номер текущего хоста (сетевого узла). max1@hp:~$ echo $HOSTNAME hp SECONDS[=n] Количество секунд прошедших с момента запуска оболочки или же количество секунд,прошедших с момента присваивания значения этой пременной, плюс n ,если n задано. $ echo $SECONDS 9606 HOSTTYPE Символьная строка ,описывающая главную cистему $ echo $HOSTTYPE x86_64 Пример вывода некоторых наиболее важных переменных $ echo $USER;echo $HOME;echo $LOGNAME max /home/max max $echo $DESKTOP_SESSION; $echo$DISPLAY;echo $TERM mate :0 xterm $ echo $SHELL;echo $PWD /bin/bash /home/max $ echo $PATH /home/max/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin $ echo $SHELL;echo $PWD /bin/bash /home/max $ echo $SHELL;echo $PWD /bin/bash /home/max $ echo $RANDOM Номер случайного числа 18264 $ echo $SECONDS Количество секунд с момента запуска оболочки 430 $ echo $HISTCMD Номер текущей команды 2003 $ echo $HOSTNAME Текущий хост hp 4.6 Другие переменные оболочки. Перечисленные переменные не устанавливаются автоматически. Их можно определить в соответствии со своими потребностями в файлах .bash_profile , .profile. BASH_COMPAT Если в ней задана пустая символьная строка ,то устанавливается уровень совместимости, присущей текущей оболочки. BASH_ENV Если эта переменная устанавливается при запуске оболочки,она именует файл,обрабатываемый для команд инициилизации. BASH_LOADABLES_PATH Один или несколько разделяемых двоеточием путей,по которым осуществляется поиск динамически загружаемых встроенных команд,указанных по команде enable. BASH_XTRACEFD=n Дескриптор файла, в который оболочка BASH записывает результат трассировки,выводимый из команды set -x. CDPATH=каталоги Каталоги искомые по команде cd. $ echo $CDPATH + echo CHILD_MAX=n Максимально устанавливаемое количество процессов, для которых оболочка запоминает коды завершения. $ CHILD_MAX=4096 + CHILD_MAX=4096 $ echo $CHILD_MAX + echo 4096 4096 COLUMNS=n Ширина столбца на экране, применяется в цикле select. $ COLUMNS=60 + COLUMNS=60 $ echo $COLUMNS + echo 60 60 EMACS Ели значение переменной начинается с буквы t Bash посчитает ,что она выполняется в буфере редактора EMACS. ENV=файл Наименование сценария, выполняемого при запуске в режиме работы по стандарту POSIX/ EXECIGNORE=список шаблонов. Разделяемый двоеточиями список глобальных шаблонов,описывающих ряд имен файлов игнорируемых при поиске исполняемых файлов. FCEDIT=файл Редактор ,применяемый в команде fc. FIGNORE=список шаблонов. Разделяемый двоеточием список суффиксов ,описывающих ряд имен файлов, игнорируемых при автозавершении имен файлов средствами библиотеки readline. GLOBIGNORE=список_шаблонов. Разделяемый двоеточием список шаблонов ,описывающих ряд имен файлов,игнорируемых при сопоставлении с шаблоном. HISTCONTROL=список. Разделяемый двоеточием список значений ,определяющих порядок сохранения команд в файле предистории. HISTFILE=файл. Файл в котором храниться предистория выполнения команд. По умолчанию ~/.bash_history HISTFILESIZE=n Количество строк,сохраняемых в файле предистории.По умолчанию 500. HISTIGNORE=список Разделяемый двоеточием список шаблонов ,с которыми должна полностью совпадать командная строка. Совпадающие строки не сохраняются в файле предистории. HISTSIZE=n Количество команд,сохраняемых в файле предистории.По умолчанию 500. HISTTIMEFORMAT=строка Форматирующая строка, предназначенная для вывода отметок времени вместе с командами из предистории по команде history. HCME=каталог Начальный каталог,устанавливаемый по команде login из файла / HOSTFILE=файл Оболочка должна использовать этот файлдля поиска имен хостов в целях их завершения. IFS=’символы‘ Разделители полей ввода. IGNOREEOF=n Числовое значение,обозначающее количество последовательных знаков окончания файла,которое требуется ввести прежде чем произойдет выход из оболочки. Применяется только в интерактивных оболочках. По умолчанию 10. INPUTRC=файл Применяется для библиотеки readline. Заменяет файл ~/.inputrc LANG=языковый_стандарт Выбирает по умолчанию языковый стандарт. LINES=n Высота экрана. Применяется в цикле select. MAIL=файл Файл выбираемый по умолчанию для проверки входящей почты. Устанавливается по команде login. MAILCHECK=n Количество секунд проходящих между последовательными проверками почты. По умолчанию 60 (одна минута). MAILPATH=файлы. Файлы предназначенные для проверки входящей почты. OPTERR=n Если в этой переменной установлено значение 1(по умолчанию) то оболочка выводит сообщение об ошибках из встроенной команды getopts. PATH=список_каталогов Пути по которым осуществляется поиск команд для последующего выполнения. POSIXLY_CORRECT=Если эта переменная устанавливается при запуске,оболочка переходит в режим работы по стандарту POSIX. PROMT_COMMAND=Если эта переменная установлена оболочка выполняет заданную команду всякий раз,прежде чем выводить основное приглашение. PROMT_DIRTRIM=n Обозначает ,сколько завершающих составляющих каталогов остается для специальной строки приглашения \w или \W. PS0=строка Символьная строка после чтения команды ,но перед ее выполнением P$1=строка Основная строка приглашения echo $PS1 \[\e]0;\u@\h:\w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$S1=строка Основная строка приглашения. PS2=строка Вспомогательное приглашение в многострочных командах. Обычно > или + $ echo $PS2 > PS3=строка Строка приглашения в цикле select По умолчанию #? $ PS3="Select the item number:" $ echo $PS3 Select the item number: PS4=строка Cтрока приглашения к трассировке выполняемых команд ( bash -x или set -x) По умолчанию выбирается приглашение + SHELL=файл Наименование оболочки,выбираемой пользователем по умолчанию. TERM=строка Тип терминала TIMEFORMAT=строка Форматирующая строка для вывода времени с помощью ключевого слова time. TMOUT=n Если никакой команды не введено по истечении секунд , то происходит вывод из оболочки. TMPDIR=каталог В указанном каталоге размещаются временно создаваемые файлы применяемые в оболочке. auto_resume=список Допускает применение простых символьных строк для возобновления приостановленных заданий. histchars=символы Два или три символа определяющие порядок подстановки. Первый символ сигнализирует о событии в предистории команд, второй символ обозначает быструю подстановку, а третий-начало комментария. По умолчанию избираются символы !^#. Файл в котором хранится предистория команд $ echo $HISTFILE /home/max/.bash_history Количество команд ,сохраняемых в файле предистории. max@hp:~$ echo $HISTSIZE 1000 Начальный каталог max@hp:~$ echo $HOME /home/max Выбираемый по умолчанию языковый стандарт $ echo $LANG ru_RU.UTF-8 Пути поиска команд $ echo $PATH /home/max/.local/bin:/home/max/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin Наименование оболочки,выбираемой пользователем по умолчанию. $ echo $SHELL /bin/bash Тип терминала $ echo $TERM xterm И другие не столь значимые переменные. Глава 5. Массивы. 5.1 Индексированные массивы. Массивы инициализируются с помощью специальной формы. Первый элемент нумеруется нулевым. Отрицательные индексы отсчитываются от последнего с прибавлением единицы. $ a=(0 1 2 3 4 5 6 7 8 ) $ echo ${a[4]} 4 $ echo ${a[-2]} 7 Для ссылки на массив служит форма ${…..} Пример $ car=(porsh bmv mers) $ echo ${car[0]} porsh $ echo ${car[*]} porsh bmv mers 5.2 Подстановка массивов. Подстановки переменных для массивов и их элементов выполняются 4 $ echo ${a[-2]} 7 Для ссылки на массив служит форма ${…..} Пример $ car=(porsh bmv mers) $ echo ${car[0]} porsh $ echo ${car[*]} porsh bmv mers 5.2 Подстановка массивов. Подстановки переменных для массивов и их элементов выполняются следующих формах. ${имя[i]} использовать элемент i массива имя Использовать все элементы массива ${имя[@]} ${#имя[*]} Пример, создадим простой массив $ a=(0 1 2 3 4 5 ) $ echo ${a[4]} 4 $ echo ${a[*]} 0 1 2 3 4 5 $ echo ${a[@]} 0 1 2 3 4 5 $ echo ${#a[*]} 6 $ echo ${#a[@]} 6 5.3 Ассоциативные массивы. Ассоциативные массивы те в которых индексами являются символьные строки. Ассоциативные массивы объявляются командами declare -A, local -A, readonly -A Присваивание значений элементам aссоциативного массива. Пример создадим простой ассоциативный массив $ declare -A avto=([bmv]=10 [porsh]=20 [mers]=30) Проверяем $ echo ${avto[*]} 20 30 10 $ echo ${avto[bmv]} 10 $ local -A avto=([bmv])=10 [mers]=30 bash: local: можно использовать только внутри функции.