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: можно использовать только внутри функции.