$ 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 из файла /etc/passwd.
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: можно использовать только внутри функции.
О проекте
О подписке