Академический Документы
Профессиональный Документы
Культура Документы
• Оболочка — это ваш интерфейс взаимодействия с системой. После входа в систему Unix, вы
оказываетесь в программе, которая называется оболочка.
Виды оболочек:
• Thompson Shell
• PWB Shell
• Bourne Shell
• Almquist shell (ash)
• Bourne-Again Shell (Bash)
• Korn shell (ksh)
• Z shell (zsh)
• C shell
• Fish
История Unix оболочка
Манипулирование файловой
системой
• Манипулирование файлами:
ls, touch, cp, mv, rm
• Содержимое файлов:
cat, more, less, head, tail
• Манипулирование каталогами:
mkdir, rmdir, ls, cd, pwd
• Управление владельцами и правами:
chown, chgrp, chmod
• Создание ссылок: ln
• Поиск файлов: find, locate
• Узнать тип файла: file
Файловые маски
Bash поддерживает следующие файловые маски:
• *.срр — * заменяет любую последовательность
символов.
• lecture?.docx — ? заменяет один символ.
• lecture{1,2,3}.txt — {} подставляют значения,
заданные через запятую.
• lecture[1235].txt — [] совпадают с любым из
перечисленных символов. Поддерживаются
промежутки: [a-с], [2-7].
Поток ввода/вывода
У каждого процесса есть три стандартных потока ввода/вывода:
stdin, stdout и stderr
Дескрипторы файлов stdin, stdout и stderr — 0, 1 и 2.
Перед тем как сесть писать новый скрипт будет полезно задать себе такие
вопросы:
• Какой источник данных?
• Как я буду хранить эту информацию?
• Нужно ли создавать какие-нибудь файлы? Где и скакими правами?
• Какие команды я буду использовать? На каких системах будет
использоваться мой скрипт? На всех ли системах должен
поддерживаются этот скрипт?
• Нужны ли пользователю какие-либо уведомления/сообщения? Почему
и когда?
Bash скрипты
Bash скрипт начинается с определения интерпретатора, т.е. bash:
#!/bin/bash
Зарезервированные слова:
break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не
искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным
переменным.
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.
Bash скрипты (Пример)
#!/bin/bash #указываем где у нас хранится bash-интерпретатор
parametr1=$1 #присваиваем переменной parametr1 значение
первого параметра скрипта
script_name=$0 #присваиваем переменной script_name
значение имени скрипта
echo "Вы запустили скрипт с именем $script_name и параметром
$parametr1" # команда echo выводит определенную строку,
обращение к переменным осуществляется через
$имя_переменной.
echo 'Вы запустили скрипт с именем $script_name и параметром
$parametr1' # здесь мы видим другие кавычки, разница в том,
что в одинарных кавычках не происходит подстановки
переменных.
exit 0 #Выход с кодом 0 (удачное завершение работы скрипта)
Зарезервированные переменные Bash
$DIRSTACK - содержимое вершины стека каталогов
$EDITOR - текстовый редактор по умолчанию
$EUID - Эффективный UID. Если вы использовали программу su для выполнения команд от
другого пользователя, то эта переменная содержит UID этого пользователя, в то время как...
$UID - ...содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME - имя текущей функции в скрипте.
$GROUPS - массив групп к которым принадлежит текущий пользователь
$HOME - домашний каталог пользователя
$HOSTNAME - ваш hostname
$HOSTTYPE - архитектура машины.
$LC_CTYPE - внутренняя переменная, котороя определяет кодировку символов
$OLDPWD - прежний рабочий каталог
$OSTYPE - тип ОС
$PATH - путь поиска программ
$PPID - идентификатор родительского процесса
$SECONDS - время работы скрипта(в сек.)
$# - общее количество параметров переданных скрипту
$* - все аргументы переданыне скрипту(выводятся в строку)
$@ - тоже самое, что и предыдущий, но параметры выводятся в столбик
$! - PID последнего запущенного в фоне процесса
$$ - PID самого скрипта
Условия
Структура if-then-else используется следующим образом:
• -z # строка пуста
• -n # строка не пуста
• =, (==) # строки равны
• != # строки неравны
• -eq # равно
• -ne # неравно
• -lt,(< ) # меньше
• -le,(<=) # меньше или равно
• -gt,(>) #больше
• -ge,(>=) #больше или равно
• ! #отрицание логического выражения
• -a,(&&) #логическое «И»
• -o,(||) # логическое «ИЛИ»
Условия. Множественный выбор
Правила оформления оператора case:
1. Конструкция множественного выбора начинается с ключевого слова case.
2. Сразу за ключевым словом case, внутри кавычек, следует определение
входящего параметра. Чаще всего это значение переменной.
3. Начало определения блока сравнений открывается ключевым словом in,
расположенным за входящим параметром.
4. Каждое сравнение задается шаблоном. Он может быть строкой или числом,
а также содержать механизмы подстановки. Шаблон в обязательном
порядке закрывается правой круглой скобкой.
5. Сразу за правой круглой скобкой шаблона или на следующих строках после
него располагаются команды, требующие выполнения при совпадении
входящего параметра. Последняя команда внутри такого блока должна
завершаться двумя точками с запятой «;;».
6. Если вам требуется назначить несколько шаблонов для одного и того же
блока команд используйте символ «|» для их разделения. Например, «*.txt |
*.bat )».
7. Блок сравнений должен завершаться ключевым словом esac.
Условия. Множественный выбор (Пример)
#!/bin/bash
• Пробел
• Знак табуляции
• Знак перевода строки
#!/bin/bash
file="/etc/passwd"
IFS=$'\n'
for var in $(cat $file)
do
echo " $var"
done
Циклы for в стиле C
Схема цикла при подобном подходе выглядит так:
#!/bin/bash
for (( i=1; i <= 10; i++ ))
do
echo "number is $i"
done
Цикл while
#!/bin/bash
for (( a = 1; a < 10; a++ ))
do
echo "Number is $a"
done > myfile.txt
echo "finished."
Или:
declare -a Unix=('Debian' 'Red hat' ‘Ubuntu' 'Suse' 'Fedora');