Администрирование локальных сетейРефераты >> Программирование и компьютеры >> Администрирование локальных сетей
и
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<<mark
> 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 запущенная без аргументов выдает на печать список команд ассоциированных с каждым из номеров сигналов. Ниже приведен краткий список наиболее часто используеиых сигналов.
Номер сигнала |
Описание |
Возможность перехвата |
1 |
сигнал перезапуска |
Есть |
2 |
Прерывание процесса |
Есть (если процесс не в фоне) |
3 |
Сигнал выхода |
Есть (если процесс не в фоне) |
6 |
Сигнал завершения |
Есть |
9 |
“Убиение” процесса |
Не може быть перехвачен в принцыпе |
14 |
Сигнал таймера |
Нет |
15 |
Програмный сигнал завершения процесса |
Есть |