Реферат: Администрирование локальных сетей
then <список_комманд2>
elif <список_комманд3>
then <список_комманд4>
…..
else <список_коммандN>
fi
Оператор if проверяет статус выполненной команды (в данном примере test –f)
И в случае успеха (программа возвращает 0) выполняет команды стоящие после then, в противном случае выполняются команды else/elif.
Наиболее часто используемой командой в оператореусловия является команда test. Она имеет множество опций, полный список которых можно получить обратившись к ее документации выполнив команду man test.Очень часто вместо команды test используют команду [ которая является ее фунуциональным аналогом. Здесь приводится лишь краткий список основных опций команды test.
-r file возвращает успех если файл существует и доступен для чтения.
-w file возвращает успех если файл существует и доступен для записи.
-x file возвращает успех если файл существует и выполняемый.
-f file возвращает успех если это регулярный файл.
-d file возвращает успех если это директория.
-c file возвращает успех если это специальный файл.
-s file возвращает успех если файл имеет ненулевой размер.
-h file возвращает успех если это симлинк.
-z s1 возвращает успех если длинна строки s1 нулевая.
-n s1 возвращает успех если длинна строки s1 ненулевая.
s1 = s2 проверка двух строк на равенство.
s1 != s2 проверка двух строк на неравенство
s1 возвращает успех если строка s1 непустая
n1 -eq n2 Алгебраическая проверка двух чисел n1 и n2 на
равенство. Помимо –eq есть еще ряд опций для алгебраического
сравнения такие как -ne, -gt, -ge, …
Все вышеперечисленные условия могут обьеденяться с использованием логических операторов:
! отрицание
-a Бинарный И
-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”
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51