Shell
Shell
Shell - это одна из многих команд UNIX. То есть в набор команд оболочки (интерпретатора) 'shell' входит команда 'sh' - вызов интерпретатора 'shell'. Первый 'shell' вызывается автоматически при входе в систему и выдает на экран промтер. После этого можно вызывать на выполнение любые команды, в том числе и снова сам 'shell', который создаст новую оболочку внутри прежней. С помощью shell доступно полное манипулирование системой.
Простейшие средства Shell
Shell-макроязык, его команды находятся в каталоге /bin или /bin/usr и т.п.
· ; последовательное выполнение команд
$ leep 20;reboot
· & асинхронное (фоновое) выполнение предшествующей команды
$ cc pr.c &
Рекомендуемые материалы
· && выполнение команды (k2) при условии нормального завершения предыдущей (k2)
$ k1&&k2
· || выполнение последующей команды при условии ненормального завершения предыдущей
$ cp a b || echo “Error”
· {} для группировки команд в блок
$ k1 && {k2; k3}
Здесь обе команды ("k2" и "k3") будут выполнены только при успешном завершении "k1".
· () кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора shell
Пусть мы находились в начальном каталоге "/mnt/lab"
(cd ..; ls) ls выдаст сначала содержимое каталога "/mnt", а затем содержимое "/mnt/lab", т.к. при входе в скобки вызывается новый экземпляр shell, в рамках которого и осуществляется переход. При выходе из круглых скобок происходит возврат в старый shell и в старый каталог
· . для выполнения программы из файла в текущем Shell–е
$ . $1.sh
Стандартный вход и выход. Перенаправление.
Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства).
· > перенаправление вывода.
$ ls >f1.test
команда "ls" сформирует список файлов текущего каталога и поместит его в файл "f1". Если файл "f1" до этого существовал, то он будет затерт новым.
· >> перенаправление вывода, но файл при этом не обнуляется.
$ pwd >>f1
команда pwd сформирует полное имя текущего каталога и поместит его в конец файла "f1", т.е. ">>" добавляет в файл, если он непустой.
· < и << перенаправление ввода
$ wc -l <f1
подсчитает и выдаст на экран число строк в файле f1.
$ ed f2 <<!
создаст с использованием редактора файл "f2", непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее "<<" . То есть ввод будет закончен, когда первым в очередной строке будет "!".
· | Конвейер
Средство, объединяющее стандартный выход одной команды (k1) со стандартным входом другой(k2)
$ k1|k2
Классификация команд
1. команды для работы с файловой системой
2. команды для работы с текстовыми файлами
3. тестирующие команды
1.Для работы с файловой системой используются команды:
· cd смена директории
· pwd выдать текущую директорию
· mkdir создать директорию
· cp копирование файла
· mv перенос (переименование) файла
· rm удалить файл
rm –r рекурсивное удаление
rm-i спрашивает разрешение на удаление
rm-f удалять не спрашивая
$ rm-f *.b
· rmdir удалить директорию
· ls выдать содержимое директории, по умолчанию выдаётся содержимое текущего каталога, но каталог можно и задавать
–R рекурсивный список
-l выдать файлы в длинном формате
-a выдача всех файлов, включая скрытые (т.е. начинающиеся с точки)
cd переход в домашний каталог пользователя
-t сортировка по времени создания
-r соритровка в обратном порядке
· chmod изменение права доступа к файлу или директории
· find поиск файла по файловой системе
-name файл - заставляет команду find искать указанный файл;
-print - выводит имена найденных файлов.
· cpio копирование больших объемов файлов; создание архива и извлечение из него
· tar создание архива
$ tar cvf ar.tar /tmp
· gzip
2.Команды для работы с текстовыми файлами
· cat выдать содержание файла на стандартный выход.
· split разбивает файлы на части
· less постраничная выдача текстового файла
· more постраничная выдача текстового файла (менее функционально)
· wc выводит число строк, слов и символов в файле
- с символы
- w слова
- l строки
$ ls –l | wc –l выдаёт сколько файлов в текущем каталоге
· grep ищет строку с заданной подстрокой во входном потоке
· vi Экранный текстовый редактор редактор
работает в 2-х режимах: режим набора текста и режим редоктирования
:wq выход с записью
:q выход без записи
· ed строчный текстовый редактор
· sed потоковый редактор
· diff сравнить текстовые файлы
· man выдача помощи по командам
3.Тестирующие команды и работы с переменными
· echo выдать строку на стандартный выход
$ echo “Hello”
-n не выдавать возврат коретки после строчки
-e разрешить служебные символы внутри строки
· date команда работы с датами, формат выдачи можно задавать
· cal календарь
· expr вычислить выражение
$ expr 2 + 3
· eval выполнить выражение (shell команду)
$ str=”cat f1”
$ eval $str
· set выдать переменные среды
· who выдаёт пользователей, работающих в системе
· ps показывает список выполняющихся процессов
· kill убить процесс
kill <№ процесса> убить навсегда
kill all <Название процесса> убить процесс по имени
· file выдаёт тип файла
· type Выдаёт тип
$ type ls
Ответ: /bin/ls
· test выполняет проверку условий
Вызов команд
<команда> [ключи] -- <аргументы >
Все аргументы разделяются пробелами. Шаблоны и переменные интерпретируются shell, команде передаются реальные значения.
$ ls|grep “.txt” выдают файлы txt в каталоге
$ переход на другую строку в конвейере
Для вызова собственных команд необходимо указать путь:
/home/stud/имякоманды
./имякоманды
Получение справки по команде.
команда --help
команда -?
man команда
man №раздела команда
Выполнение команды с помощью функций exec:
execl (путь, аргумент1, аргумент2, … , 0)
execlp (файл, аргумент1, аргумент2, … , 0)
execle (путь, аргументы, среда)
execv (путь, двумерный массив аргументов)
execvp (файл, двумерный массив аргументов)
Шаблоны файлов
Шаблон — это средство, которое позволяет задавать несколько имён файлов по определённому образцу. Шаблоны интерпретирует сам Shell.
set –f отключить работу шаблонов
set +f включить работу шаблонов
1. * обозначает любое число символов
rm * удалить все файлы
2. ? один символ
rm ?? удалить файлы в каталоге, которые содержат 2 символа
rm ??* удалить файлы в каталоге, которые содержат 2 и более символов
3. [] один символ из заключённого в них набора
rm [abcd] * удалить все файлы, которые начинаются на a,b,c,d
4. {}
сp t1.{exe,com} /tmp скопировать все файлы .com и .exe в /tmp
эквивалентно
сp t1.exe t1.com /tmp
5. # комментарий до конца строки
echo “Вася” # здесь был Вася =)
Чтобы все перечисленные символы не интерпретировались Shell’ом как шаблон, их необходимо заключать в кавычки - ‘*’ – или экранировать - *.
Переменные в Shell
Переменные в Shell имеют один тип - строковые. При обращении к shell-переменной необходимо перед именем ставить символ '$'.
$ a=hi
$ echo $a
Ответ: hi
$ echo ‘$a’ значение $a не интерпретируется Ответ: $a
Чтобы в переменную записать содержание файла: c=`cat f1`
Для того чтобы имя переменной не сливалось со строкой, следующей за именем переменной, используются фигурные скобки {}.
a=hi
a=${c}all
С помощью {} можно
· установить значение по умолчанию
· выделить подстроку в значении переменной
· произвести замены
man bash- см. инструкцию.
Переменные окружения
Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд переменных этой среды. Если вы наберете команду 'set' без параметров, то на экран будет выдана информация о ряде стандартных переменных, созданных при входе в систему, а также переменных, созданных и экспортируемых вашими процессами.
Переменные окружения:
HOME=/home/kdb имя домашнего каталога
PATH=/usr/local/bin:/usr/bin: переменная, содержащая пути, в которых shell ищет заданные команды
LOGNAME имя пользователя
UID индификатор
PS1,PS2 вид промера(подсказки: $ у root; # у простых смертных)
LANG язык (ru – русский, c – английский)
LS_COLORS цвета при выводе в команде ls.
Создать переменную окружения можно командой export.
export a создает переменную окружения a
export PATH= $PATH:/home/stud добавляет в PATH домашний каталог
export PATH= $PATH:. добавляет в PATH текущий каталог
export LS_COLORS=exe-red:sh-green устанавливает цвета у файлов с указанным расширением
Командные файлы
В интерпретаторе shell существует два режима работы: выполнение команд из командной строки и последовательное выполнение всех команд из файла.
В начале этот файла должен быть указан транслятор. В нашем случае это - sh, находящийся в директории /bin
#!/bin/sh
Далее следует сама программа.
При выполнении sh с ключом –x файл будет выполняться с выдачей отладочной информации.
Пример программы:
#!/bin/sh
name=$1
echo “Привет, ${name}!”
Для того чтобы файл мог выполняться, ему надо сменить тип доступа.
$ chmod 755 prog
где 755 - тип доступа, prog - имя файла.
$ prog
$ ./prog
$ prog f1 5 k
$ echo $2
5
$ echo $* //$* выдать все аргументы
f1 5 k
$ echo $# //$* выдать число аргументов
3
shift — сдвигает аргумент, в этом случае, обращаясь к $1, можно организовать цикл.
Функции
имя_функции ()
{ тело функции }
########## Prog.sh #######
foo()
{
Echo “$1-hello”
}
foo Hi
#########################
$ a=`foo Vasya`
$ echo $а
Ответ Vasya Hello
Команда TEST
Команда 'test' проверяет выполнение некоторого условия. С использованием этой (встроенной) команды формируются операторы условия (if) и цикла (while, until) языка shell. Команда "test" дает значение "истина" (т.е. код завершения "0")
Два возможных формата команды:
test условие
или
[ условие ]
Условие может задаваться через
· числа
· строки
· имена файлов
Shell будет распознавать эту команду по открывающей скобке '[', соответствующей команде 'test'. Между скобками и содержащимся в них условием обязательно должны быть пробелы.
[ $a ] && echo $a если верна первая команда, то выполнить вторую
[ ‘$a’ ]
[ -z ‘$a’ ] проверяет пустая ли строка
[ “s” = ”Hi” ] сравнение.
Условия сравнения чисел.
Переменные-числа в “” не записываются.
· x -eq y # x равно y,
· x -ne y # x неравно y,
· x -gt y # x больше y,
· x -ge y # x больше или равно y,
· x -lt y # x меньше y,
· x -le y # x меньше или равно y.
[ $x = 5 ] && echo “Отлично”
[ $x -lt 5 ] && echo “Меньше 7”
Условия проверки файлов
· -f имя файла Существует ли этот файл ?
· -d имя файла Является ли каталогом ?
· -с имя файла Специальный файл
· -r имя файла Файл доступен на чтение
· -w имя файла Файл доступен на запись
· -s имя файла Файл не пустой
[ -с /tmp/f ] Проверяет, существует ли файл с именем f
Сложные условия
усл.1 –a усл.2 = and «и»
усл.1 –o усл.2 = or «или»
Проверка условий:
&& позволяет выполнить 2-ю команду в случае успешного выполнения 1-й команды
[ “$str” = “55” ] && echo 55
k1 ||k2 команда k2 выполняется при условии неудачного выполнения k1
[ -d /tmp/v ] || mkdir /tmp/v
IF
Команда ветвления. В общем случае оператор 'if' имеет структуру
if команда
then команды
[elif команда
then команды]
[else команды]
fi
В зависимости от кода возврата выполняется та или иная ветвь.
if [ "$s" = "Привет" ]
then
echo "Hi"
else
echo "Не понимаю"
fi
if grep “слово” /tmp/f
then echo “нашли”
fi
CASE
Оператор выбора 'case' имеет структуру:
case <строка> in
<шаблон>) <команды>;;
<шаблон>) <команды>;;
esac
Пример.
echo "Сколько лет? "
read z
case $z in
?|1? )echo “Ребёнок”;;
?? ) echo “Молодёжь”;;
3?|4?|5? ) echo “Взрослый”;;
esac
FOR
Оператор цикла "for" имеет структуру:
for <переменная> [in < значения >]
do
команды
done
Переменная приобретает поочередное значение из списка, а если список не задан , от аргументов программы.
Расчет сортировки трех файлов f1, f2, f3 будет выглядеть так:
for i in f1 f2 f3
do
sort $i > $i_sorted
done
for i in *.txt
do
gzip $i
done
WHILE
Структура оператора цикла с истинным условием 'while', обеспечивает выполнение расчетов, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.
while команда
do
<команды>
done
n=0
while [ $n -lt 10 ] # пока n < 10
do
echo $i
n=`expr $n + 1`
done
cat f.txt|while read a b
do
echo “ $a съел $b”
done
Список команд в теле цикла повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ('break', 'continue' или 'exit').
UNTIL
Оператор цикла с ложным условием 'until' имеет структуру:
until команда
do
список команд
done
Пример 'Ожиданние 12:00'.
until date | grep "12:00:"
do
sleep 1
done
echo “Подъем”
Регулярные выражения
- это язык, описывающий шаблоны строк (дополнительную информацию искать в man 7 regex).
Существуют 2 типа регулярных выражений:
1) стандарта POSIX
2) принятый в языке Perl
· Одиночный символ, кроме / [ { + * - $ ? ^
$ grep “a” f.txt ищет строки, содержащие “a”
Для использования метасимволов их экранируют.
$ grep “ a[i] ” f.txt
· Мнимые символы
^ начало строки
$ конец строки
$ grep “ ^ups$ ” f.txt ищет строку, состоящую из слова “ups”
· Любой символ кроме конца и начала строки обозначается точкой (.).
$ grep ‘ab.d’ f1.txt
· Классы символов []
[abc] любой из символов 'a', 'b' и 'c'
[a-zA-z] любая английская буква
· Альтернатива
$ grep “ р|P” f.txt ищем строку, где встречается p или P
· Группировка ()
‘(hi)|(hello)’
· Квантификатор- показывает сколько раз символ должен повторяться
+ один и более раз
* ноль и более раз
? 1 или 0 раз
{n} n раз
{n,} n раз и более
{n,m} от n до m раз
Пример.
‘[a-zA-z]+@([a-z]+ .)+[a-z]+’ шаблон на e-mail
Регулярные выражения используются в конфигурационных файлах, базах данных, командах grep, sed, awk, lex и т.д.
Потоковый редактор SED
Команда копирует файлы (по умолчанию со стандартного входа) на стандартный выход, редактирует их в соответствии со своими(!) командами, размещенными в "сценарии" (в командном файле или строке редактора [а не shell!]).
$ sed [-e] ‘сценарий’ [файл]
-f берет команды из файла сценария
-e script «скрипт»
-r будут использоваться регулярные выражения
Сценарий (скрипт) состоит из команд редактирования, по одной в строке, имеющих формат:
[ адрес1 [ , адрес2 ] ] команда [ аргументы ]
"sed" циклически преобразует входные строки в выходные.
Адреса "[ адрес1 [ , адрес2 ] ]" - это либо номера строк, либо
последняя строка (символ "$"), либо регулярные выражения в стиле
редактора "ed":
- "" используется в многострочных командах для
экранирования продолжения строки.
- "." совпадает с любым символом.
- Если адреса не указаны - просматриваются все входные
строки.
- Если один адрес, то выбираются совпадающие строки.
- Если заданы два адреса, выбираются строки в заданном
интервале.
- "!команда" выполняется команда "команда", для строк, которые не
были выбраны по адресам.
1.a
text добавляет text после указанной строки
Пример.
$ who | sed '2a
новая строка
'
Результат:
root tty1 Mar 13 17:23
mas tty2 Mar 13 18:50
новая строка
kdb tty6 Mar 13 17:24
kdb tty5 Mar 13 17:24
2.b label
Осуществляет переход к команде ("команда") "label:команда" Если
метка ("label") отсутствует, то переход на конец командного файла.
3.c
text Удаляет выбранные строки и заменяет их на "text'.
4.d Удаляет найденные строки
5. i
text Вставляет "text" перед выбранной строкой.
(сравните с "a")
Пример:
$ who | sed '2i
новая строка
'
Результат:
root tty1 Mar 13 17:23
Лекция "11 Марковские модели для оценки надежности" также может быть Вам полезна.
новая строка
mas tty2 Mar 13 18:50
kdb tty6 Mar 13 17:24
kdb tty5 Mar 13 17:24
6.p Выводит найденные строки (используется с флагом "-n").
7.q Выходит из "sed".