Администрирование локальных сетей
-o Юинарный ИЛИ (-а имеет приоритет больший чем –о)
( expr ) Группировка выражений скобками
Ввод данных.
Для ввода иданных в скрипт можно воспользоваться командой
read [parameter …]
которая в качестве аргументов принимает список из одного или более параметров.
Примечание: знак $ перед именем параметра в команде read ставить не нужно.
Циклы.
Очень часто при составлении скриптов простого последовательного выполнения бывает недостаточно. Необходимы механизмы которые позволяли бы выполнять команды с изменяющимися параметрами. Для этих целей шелл предоставляет в распоряжение три цикличекие конструкции: циклы for,while и untill.
Цыкл for
Этот тип циклов позволяет выполнять один и тот же набор команд каждый раз с новыми значениями полученными из списка параметров. Он имеет следующий формат:
for parameter [ in wordlist ]
do command-list
done
где parameter это любое имя параметра, wordlist – один или несколько значений последовательно присваиваемых параметру, command-list – набор команд выполняемых при каждом проходе цикла. wordlist может быть либо просто набором аргументов разделенных пробелом, либо командой шелла которая генерирует сама аргументы. Например следующий скрипт:
for i in 1 2 3 4 5
do
if mkdir $i
then
echo “directory $i was created”
fi
done
создает последовательно директории с именами 1 2 3 4 5 и в случае успешного создания директории выдает сообщение. Следующий скрипт:
for i in `ls a*`
do
cp $i /tmp
echo “$i was copied”
done
копирует все файлы начинающиеся с буквы a из текущего каталога в каталог /tmp.
Цикл while
while command-list1
do command-list2
done
этот цикл запускает команды из списка command-list1, и если последняя команда из списка выполнилась успешно (код возврата равен 0) то начинают выполняться команды из списка command-list2, в противном случае цикл заканчивается. Цикл из следующего примера:
while [ -r $1 ]
do
echo “processing $1”
cat $1 >> summary
shift
done
по очереди считывает аргументы командной строки, в случае когда в текущем каталоге присутствует файл доступный на чтение с именем совпадающим с этим аргументом, содержимое этого файла дописывается к файлу с именем summary. В противном случае, скрипт прекращает свою работу.
Цикл util
until command-list1
do command-list2
done
конструкция этого цикла полностью аналогична циклу while за исключением того что тело цикла (набор команд command-list2) выполняется как минимум один раз не зависимо от успешности выполнения условия цикла (набор команд command-list1).
Оператор case
Оператор case является расширением стандартного условного оператора if. Если есть условие при котором может реализовываться множество вариантов то вместо серии операторов if лучше использовать один case.
case parameter in
pattern1 [ | pattern2 …] ) command-list1 ;;
pattern2 [ | pattern3 …] ) command-list2 ;;
…
esac
шаблоны pattern определяют варианты параметра parameter. При совпадении параметра с одним из шаблонов будет выполнен соответствующий список команд command-list. В квадратных скобках ([ | pattern2…] ) указаны дополнительные варианты разделенные символом ( | ) которые может принимать parameter помимо основного. Заканчивается список шаблонов скобкой. Более понятней структура этого оператора станет после рассмотрения примера:
case $i in
-d | -c ) mkdir dir1
echo “directory dir1 was created” ;;
-r ) rmdir dir1
echo “directory dir1 was removed” ;;
* ) echo “invalid option” ;;
esac
В этом примере скрипт получив при запуске один из аргументов –d или –c попытается создать директорию с именем dir1 , получив аргумент –r попытается ее стереть. Во всех остальных случаях (шаблон *) он выдаст предупреждение о неправильном аргументе.
Примечание: обратите внимание на то что порядок следования гшаблонов в операторе case имеет большое значение. Так если строку
* ) echo “invalid option” ;;
поставить в самое начало, то на ней будет все время терминироваться скрипт.
Команда . (точка)
Каждый раз когда Вы запускаете шелл программы, создается еще одна копия шелла в которой они выполняются. Поэтому если Вы написали шелл скрипт, то все переменные “живут” только во время выполнения скрипта. Если вы хотите чтобы все переменные из шелл программы были в вашем текущем окружении запускать скрипт нужно в текущем шеле, это достигается использованием команды . (точка).
. scriptname
Команда eval
eval [arg ...]
Аргументы читаються и соединяются в одну команду. Затем эта команда выполняется шеллом и статус выхода команды возвращается как результат команды eval. Если аргументы в команде отсутствуют или пустые то команда возвращает нулевой статус.
В качестве примера рассмотрим два скрипта:
d=’date &’ ; $d
и
d=’eval date &’ ; $d
первый из них не выполнится так как команда date воспримет символ & как аргумент а не как признак запуска в фоновом режиме, в результате чего первый скрипт не выполнится в отличии от второго.
Использование метасимволов.
Во всех конструкциях циклов и операторе case возможно использование метасимволов. Например скрипт из примера оператора цикла for
for i in `ls a*`
do
cp $i /tmp
echo “$i was copied”
done
можно переписать в более простом виде
for i in a*
do
cp $i /tmp
echo “$i was copied”
done
результат будет один и тот же.
2.3.1 Некоторые специальные команды
Разделители && и ||
Это условные разделители. При разделении двух команд с помощью && вторая команда выполнится лишь в том случае когда первая завершится успешно. При разделении команд с помощью || вторая выполнится лишь тогда когда первая закончилась неуспешно (код возврата не равен нулю).
Например при выполнении скрипта:
test –d /usr/tools && cd /usr/tools
test –d /usr/tools || echo “directory doesn’t exist”
вход в директорию /usr/tools будет произведен только при ее наличии, в противном случае будет выдано сообщение о ее отсутствии.
Определение функций
Для сокращения обьема шелл программ и упрощения их понимания и сопровждения шелл допускает введение и использование функций. Для опредения функции используется следующий синтаксис:
name () { list; }
где name – это имя функции, а list – список команд из которых состоит тело функции. Ниже приведен пример функции возвращающей 0 если аргумент переданный ей является директорией и 1 в противном случае.
dir_test () {
if [ -d $1 ]
then
echo “$1 is a directory”
return 0
else
echo “$1 is not directory”
return 1
fi;
}
вызов функции осуществляется следующим образом
name [ parameter … ]
например в нашем случае это можно сделать так
dir_test /usr/bin/sh
Перенаправление ввода-вывода
Как было сказано выше для перенаправления ввода-вывода используються символы (> перенаправление вывода, >> перенаправление вывода с добавлением в файл и < перенаправление ввода). Кроме этого существует еще ряд конструкций, одна из которых:
<< [-] word
при этом все линии от первой и до содержащей строчку word будут использоваться как входные данные. Например:
$
cat<
> These words will be
printed
> the cat command
until the "mark"
> word is found
> mark
These words will be
printed
the cat command until the
"mark"
word is found
$ Если
перед строчкой
word стоит минус
то все символы
табуляции в
начале строк
будут вырезаны. Другой
часто используемой
конструкцией
при перенаправлении
ввода-вывода
является: <&
цифра >&
цифра При
этом задействуется
файловый дискриптор
ассоциированый
с указаной
цифрой. В большинстве
программ со
стандартным
вводом связан
дискриптор
0, со стандартным
выводом дискриптор
1, и со стандартным
потоком ошибок
дискриптор
2. Все программы
которые работают
друг с другом
через пайпы
по умолчанию
пользуються
дискрипторами
0 и 1. Наиболее
часто используемые
перенаправления
это 1>&2 и
2>&1. Рассмотрим
следующий
пример из которого
станет понятен
смысл этих
конструкций: $
ls /no/such/file > out
/no/such/file not found
$ cat out
$
$ ls /no/such/file >out
2>&1
$ cat out
/no/such/file not found
$ первая
команда пытается
вывести листинг
не суцествующего
файла перенаправив
стандартный
вывод в файл
out. Файл
out при этом оказывется
пустым т.к. сообщение
об ошибке выводится
в стандартный
поток ошибок
и появляется
на терминале.
Вторая команда
объединяет
стандартный
поток ошибок
со стандартным
выводом который
перенаправлен
в файл out.
При этом сообщения
об ошибке попадают
в файл, о чем
свидетельствует
команда cat. Команда
exec
exec
[arg
…] Эта
команда выполняет
замещение
текущего шела
новым шелом
или программой.
Разница между
простым запуском
шела и запуском
через exec
становится
очевидной на
следующем
примере:
$ ksh
$ ps
PID TTY TIME COMMAND 2125
pts/0 0:00 ksh 2094
pts/0 0:00 sh 2126
pts/0 0:00 ps $
$ exec ksh
$ ps PID
TTY TIME COMMAND 2127
pts/0 0:00 ps 2094
pts/0 0:00 ksh
$ Команда
expr
expr
expression
{ +, -, *, /, *, =, >, >=, <, <=, != } expression Это
очень полезная
команда для
выполнения
арифметических
операций в шелл
скриптах. Например: x=10 expr
$x + 5 y=`expr $x – 10` if
expr $x <= $y then echo
“$x is less or equal than $y” fi Команда
set Эта
команда используется
во многих
модификациях.
Основное назначение
– это устанавливать
значение параметров.
Если Вы просто
запустите эту
команду без
аргументов
то увидите все
параметры
вашего окружения,
большинство
из которых было
установлено
при входе в
систему из
файла .profile. Наример
команда: set
bob brr kab ram установит
параметры $1,
$2, $3, $4 следующим
образом $1=”bob”,
$2=”brr”, $3=”kab”, $4=”ram”.
Команда set имеет
множество
опций, полный
список которых
можно получить
обратившись
к man-странице
(man set). Команда
trap Команда
trap ожидает приход
сигналов посланных
шелу (от внешних
процессов или
сигнал от шела
вследствии
неуспешного
запуска программы)
и выполняет
их обработку. trap
[command_list]
[s1
…] Когда
trap получает
сигнал s1 (сигналы
s2 …) она выполняет
список заранее
предопределенных
в command_list
команд. Если
s1 равен 0, то команды
запускаются
когда шелл
заканчивает
свою работу.
Команда trap
запущенная
без аргументов
выдает на печать
список команд
ассоциированных
с каждым из
номеров сигналов.
Ниже приведен
краткий список
наиболее часто
используеиых
сигналов. Номер
сигнала Описание Возможность
перехвата Попытка
перехватить
11-й сигнал (memory fault)
приводит к
ошибке. Сигнал
с номером 9 не
может быть
перехвачен
т.к. он не перехватывается
в принципе.
Очень
часто возникает
ситуация когда
скрипт в процессе
работы создает
временные файлы
которые затем
нужно удалить,
но в случае
прерывания
процесса какимто
из сигналов
эти файлы не
будут удалены.
Эта проблема
решается в
следующем
примере:
trap “echo
‘removing temporaty file’ rm /tmp/temp” 0 1 2 3 15 Команда
pwd Эта
команда показывает
текущую рабочую
директорию. Команда
type
type [ prog_name
…] Эта
команда ищет
каталог в котором
находится
запускаемая
программа
указанная в
аргументе
команды.
Команда
times Эта
команда выдает
информацию
о времени выполнения
процесса запущеного
из шелла. Параметры
устанавливаемые
шеллом Параметр Описание Основные
опции для запуска
Bourn Shell Опция Описание При
запуске шела
в restricted mode запрещается: Изменение
директории
командой cd Устанавливать
переменную
окружения PATH Запускать
программы
содержащие
в имени символ
/ Перенаправлять
ввод-вывод
C Shell . 2.3.1
Общие сведения. 2.3.2
История команд 2.3.3
Алиасы, подстановка
команд, метасимволы 2.3.4
Переменные
csh 2.3.5
Задания 2.3.6
Скрипты 2.3.7
Управляющие
структуры
скриптов. 2.3.1
Общие сведения. csh
это командный
интерпретатор
HP-UX и язык программирования
высокого уровня
используемый
для трансляции
команд вводимых
пользователем
в системные
действия такие
как запуск
программ, перемещение
по директориям
файловой системы,
управление
информационными
потоками между
программами.
csh в отличии
от Bourne Shell имеет ряд
дополнительных
полезных возможностей Буфер
истории команд Механизм
алиасов
Расширеный,
С-подобный
командный язык Выход
из шелла может
осуществляться
несколькими
способами: по
команде exit
(либо logout
если это логин
шелл) и также
в зависимости
от переменной
окружения
ignoreoff если
она не установлена,
то по
комбинации
клавиш Ctrl-D.
Запуск
шелла В
зависимости
от того является
ли csh Вашим
логин-шеллом
возможны различные
сценарии его
запуска. При
запуске csh
проверяет
файлы: /etc/csh.login Если
csh это
логин-шелл и
этот файл существует,
то он
выполняется .cshrc Если
этот файл существует
в вашем домашем
каталоге,
то он выполняется
в любом случае. .login Если
csh это
логин-шелл и
этот файл существует
в
домашнем
каталоге то
он выполняется .logout Если
этот файл существует
в домашнем
каталоге, то
он
выполняется
всякий раз при
выходе из шелла
если это
логин-шелл
Установка
переменных Существуют
два типа переменных
которые могут
быть устаовлены
в .cshrc и .login,
это локальные
переменные,
которые не
передаются
дальше порождаемым
из шелла процессам
и носят название
локальных
переменных
и глобальные
переменные,
которые становяться
доступными
всем процессам
порожденным
из шелла и носят
название переменных
окружения.
Локальные
переменные
устанавливаются
командой set
, глобальные
– командой
setenv. 2.3.2
История команд csh
поддерживает
так называемый
буфер команд
в котором храняться
последние
введенные
команды называемые
событиями.
Размер буфер
определяет
переменная
history. Переменная
savehistory определяет
сколько команд
буфера подлежит
сохранению
перед выходом
из шела. Наиболее
оптимальным
размером буфера
считается буфер
на 10 … 20 команд.
Просмотр буфера
возможен по
команде history.
Подстановка
команд из буфера
осуществляется
с использованием
символа восклицательного
знака ( ! ). Переменная
prompt отвечает за
вид системоной
подсказки. Например,
выполнив команду:
% set prompt='[!] % '
[2] % можно
изменить стандартную
системную
подсказку на
новую в которой
в скобках
отображается
номер последнего
события. Повторный
запуск событий
из буфера может
осуществляться
по: По
номеру события:
!n где
n – это
номер события
в буфере Относительному
номеру события
относительно
текущего события:
!-n Тексту
события:
!word
где word
– первые несколько
символов события.
Например набрав
один раз команду
history,
в следующий
раз можно
использовать
вместо этого
команду
!h. Как
специальный
случай следует
отметить команду
!! которая
запускает
повторно самое
последнее
событие. csh
также допускает
использование
аргументов
команд находящихся
в буфере при
посторении
новых команд.
Каждый аргумент
в событии хранящемся
в буфере нумеруется
начиная с нуля
(нулевой аргумент
– имя самой
команды). Последний
аргумент еще
представляется
знаком ( $ ),
первый аргумент
знаком ( ^ ).
Для ссылки
на на аргумент
события нужно
после номера
события через
двоеточие (
: ) ввести
номер аргумента
или его обозначение.
Например: cruiser
4: ls -l .cshrc
-rw-r--r-- 1 roman
users 814 Jan 2 23:08 .cshrc
cruiser 5: history 1
ls -l .profile 2
history 3
cat .profile 4
ls -l .cshrc 5
history
cruiser 6: cat !4:$
cat .cshrc
#
# Default user .cshrc
file (/usr/bin/csh initialization).
set path=( $path )
# Set up C shell
environment: if
( $?prompt ) then # shell is interactive. set
history=20 # previous commands to remember. set
savehist=20 # number to save across sessions. set
system=`hostname` # name of this system. set
prompt = "$system !: " # command prompt.
endif 2.3.3
Алиасы, подстановка
команд, метасимволы csh
предоставляет
дополнительные
удобства в виде
командных
алиасов. Например,
вместо того
чтобы каждый
раз при необходимости
вывести полный
листинг директории
или при выходе
из шелла набирать
набирать полные
команды, можно
создать их
сокращенные
псевдонимы
(dir и x):
alias dir ls –als
alias exit x для
снятия алиаса
нужно воспользоваться
командой
unalias : unalias
dir чтобы
просмотреть
список всех
алиасов имеющихся
в данный момент
нужно ввести
команду
alias без параметров. Подстановка
команд Подстановка
команд в csh
выполняется
полностью
аналогично
подстановке
в Bourne Shell рассмотреной
перед этим:
cruiser 7: set dir=`pwd`
cruiser 8: echo $dir
/home/roman
cruiser 9: Метасимволы Все
етасимволы
включая синтаксические
( ; | () & || && )
а так же файловые
( ? * [] ~ ) и
метасимволы
квотинга (
‘ “ ) в csh
имеют тот же
смысл что и
рассмотренные
перед этим в
Bourne Shell.
2.3.4
Переменные
csh Имя
переменной Описание $argv $autologout $cwd $home $ignoreeof $noclobber $notify $path Путь
для поиска
выполняемых
файлов. При
изменении
этой переменной
нужно уведомить
шелл выполнив
команду rehash $prompt $status Цифровые
переменные
csh Команда
at ( @ ) назначает
цифровой переменной
арифметическое
значение, точно
так же как и
команда set
назначает
значение стороковой
переменной.
Значением
цифровых переменных
являются десятичные
целые.
% @ sum=( 1 + 2 )
% echo $sum
3 Основные
арифметические
операции в csh Операция Описание Основные
логические
операции в csh Операция Описание Кроме
этих операций
есть еще ряд
логических
операций которые
должны быть
взяты в скобки
и их операнды
должны ьыть
разделены
пробелами в
виде (
operand1 >=
operand2 ) Операция Описание < <= << Например: %
@ r= ( 2 << 4 ) %
echo $r 32 Основные
операции присвоения
в csh Операция Описание Постфиксные
операции К последним
относятся
операции ++
и -- % @
a=10 % @ a++ %
echo $a 11 Основные
файловые операции Виражения
в csh
могут возвращать
значение в
зависимости
от наличия или
отсутствия
файла, прав
доступа к нему,
и.т.п. Для этого
используется
следующий
синтаксис: -file_test
filename где file_test
и
filename
могут принимать
следующие
значения file_test
описание 2.3.5
Задания Каждый
раз когда одна
или больше
команд (например
связанные через
пайп, или последовательно)
выполняються
шелл создает
один блок команд
назывемый
заданием. Фактически
каждая строка
введенная в
строке шелла
является заданием.
Задание может
исполняться
также в фоновом
режиме если
при запуске
в конце стоял
символ &.
В этом случае
после запуска
шелл выдаст
номер задания
в своей таблице
заданий и номер
процесса. Просмотреть
таблицу активных
в данный момент
заданий можно
воспользовавшись
командой jobs
. После завершения
фонового процесса
шелл проинформирует
пользователя
об этом. %
sleep 10 & [1]
73059 %
jobs [1]
+ Running sleep 10 %
ps PID
TTY TIME COMMAND
71453
pts/2 0:00.03 -sh (csh)
73059 pts/2 0:00.00
sleep 10
73061 pts/2 0:00.00
ps
…. Спустя
10 секунд ….
%
[1] Done sleep 10 2.3.6
Скрипты сsh
крипты могут
как и Bourne Shell скрипты
быть запущены
двумя способами.
Либо csh
script_file arg1 arg2 …. либо
установив
атрибут исполняемости
на файл и запустив
его chmod
+x script_file ./script_file
arg1 arg2 …. При
этом первая
строчка должна
содкржать
полный путь
к интерпретатору
с префиксом
#! , в нашем случае
она должна
выглядеть так:
#!/usr/bin/csh . Без
этой строчки
система в качестве
интерпретатора
скрипта запустит
Bourne Shell что приведет
к ошибке. При
запуске csh
помещает аргументы
скрипта в массив
argv доступ
к которым возможее
через argv[1],
argv[2], … Аргумента
argv[0] не
существует,
вместо этого
имя скрипта
помещается
в аргумент $0. Для
проверки установлена
ли данная переменная
можно воспользоваться
конструкцией
$?variable Чтобы
узнать сколько
значений хранит
переменная
нужно использовать
следующий
синтаксис: $#variable Для
доступа к компонентам
переменной
необходимо
следовать
следующему
правилу: $variable[componet_number] Также
как и в Bourne Shell возможно
использование
переменных
$n вместо
argvn и $*
вместо $argv.
В отличии от
команды read
в Bourne Shell csh
использует
конструкцию
$< для
интерактивонго
ввода.
Все
вышесказанное
иллюстрируется
на следующих
примерах:
% echo $#var1
var1: Undefined variable.
% set var1=a
% echo $#var1
1
% set var1=(a b c)
% echo $#var1
3
% echo $var1[1]
a
% echo $var1[1-3]
a b c
% set a=($<)
xxx
% echo $a
xxx Еще
одно отличие
csh от Bourne Shell заключается
в том что с помощью
фигурных скобок
{ } можно
проверять
завершилась
ли нормально
команда помещенная
в эти скобки.
Например, следующий
скрипт:
#!/usr/bin/csh
if ({ cat /tmp/aaa })
then echo
OK
endif в
случае успешного
вывода содержимого
файла /tmp/aaa
напечатает
в конец фразу
OK. 2.3.7
Управляющие
структуры
скриптов. В
виду того что
все управляющие
структуры csh
очень похожи
на аналогичные
в Bourne Shell кратко
остановимся
лишь на их
синтаксисе.
По своему синтаксису
они очень близки
с аналогисными
командами языка
программирования
С. Условный
оператор
if ( expression )
then command1
command2 …
else
command1
command2 …
endif Если
требуется
запуск лишь
одной команды
то endif можно
не ставить: if
( expression
) command Цикл
foreach Этот
цикл является
полным аналогом
цикла for
Bourne
1
сигнал
перезапуска
Есть
2
Прерывание
процесса
Есть
(если процесс
не в фоне)
3
Сигнал
выхода
Есть
(если процесс
не в фоне)
6
Сигнал
завершения
Есть
9
“Убиение”
процесса
Не
може быть
перехвачен
в принцыпе
14
Сигнал
таймера
Нет
15
Програмный
сигнал завершения
процесса
Есть
$#
Количество
аргументов
командной
строки
$?
Значение
кода возврата
предыдущей
команды
$$
Номер
процесса шела
в системе
$!
Номер
процесса в
системе последней
команды запущеной
в фоне
-с
string
Выполнять
команды из
файла string
-s
Выполнять
команды полученные
со сотандартного
ввода (в случе
запуска шела
без опций он
ведет себя
также)
-r
Запустить
шелл в ограниченном
режиме (restricted mode)
Список
аргументов
командной
строки
Авто
логаут если
шеллом не
пользовались
спустя количеству
секунд указанному
в этой переменной.
Неустановленное
или нулевое
значение отключает
авто логаут.
Указатель
текущей рабочей
директории
Домашняя
директория
Если
переменная
установлена,
то гнорировать
символ конец
файла (Ctrl-D) как
символ завершения
работы
Если
переменная
установлена,
то запретить
перенаправление
вывода в существующий
файл (операция
> ). Перенаправление
возможно лишь
с использованием
операции >!
Если
переменная
установлена
то посылать
немендленные
уведомления
после окончания
фоновых процессов
Вид
системной
подсказки
Код
возврата самой
последней
команды
( )
Скобки
изменяют порядок
выполнения
операций
+
Сложение
-
Вычитание
*
Умножение
/
Деление
%
Остаток
от деления
==
Проверка
на равенство
!=
Пооверка
на неравенство
!
Логическое
отрицание
>
Больше
Меньше
>=
Больше
или равно
Меньше
или равно
>>
Правый
битовый сдвиг
Левый
битовый сдвиг
&
Битовое
И
|
Битовое
ИЛИ
&&
Логическое
И
||
Логическое
ИЛИ
=
Простое
рисвоение а
= b
+=
a = a + b
-=
a = a - b
*=
a = a * b
/=
a = a / b
%=
a = a % b
d
Является
ли файл директорией
?
e
Существует
ли файл ?
f
Это обычный
файл ?
o
Являюсь
ли я его собственником
?
r
Имеются
ли права на
чтение из файла
?
w
Имеются
ли права на
запись в файл
x
Можно ли
исполнять
этот файл ?
Z
Пустой
ли файл