Читать интересную книгу Искусство программирования на языке сценариев командной оболочки - Мендель Купер

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 9 10 11 12 13 14 15 16 17 ... 96

echo

# Попробуем еще раз.

if [ -n "$string1" ] # На этот раз, переменная $string1 заключена в кавычки.

then

echo "Строка "string1" не пустая."

else

echo "Строка "string1" пустая."

fi # Внутри квадратных скобок заключайте строки в кавычки!

echo

if [ $string1 ] # Опустим оператор -n.

then

echo "Строка "string1" не пустая."

else

echo "Строка "string1" пустая."

fi

# Все работает прекрасно.

# Квадратные скобки -- [ ], без посторонней помощи определяют, что строка пустая.

# Тем не менее, хорошим тоном считается заключать строки в кавычки ("$string1").

#

# Как указывает Stephane Chazelas,

# if [ $string 1 ] один аргумент "]"

# if [ "$string 1" ] два аргумента, пустая "$string1" и "]"

echo

string1=initialized

if [ $string1 ] # Опять, попробуем строку без ничего.

then

echo "Строка "string1" не пустая."

else

echo "Строка "string1" пустая."

fi

# И снова получим верный результат.

# И опять-таки, лучше поместить строку в кавычки ("$string1"), поскольку...

string1="a = b"

if [ $string1 ] # И снова, попробуем строку без ничего..

then

echo "Строка "string1" не пустая."

else

echo "Строка "string1" пустая."

fi

# Строка без кавычек дает неверный результат!

exit 0

# Спвсибо Florian Wisser, за предупреждение.

Пример 7-7. zmost

#!/bin/bash

#Просмотр gz-файлов с помощью утилиты 'most'

NOARGS=65

NOTFOUND=66

NOTGZIP=67

if [ $# -eq 0 ] # то же, что и: if [ -z "$1" ]

# $1 должен существовать, но может быть пустым: zmost "" arg2 arg3

then

echo "Порядок использования: `basename $0` filename" >&2

# Сообщение об ошибке на stderr.

exit $NOARGS

# Код возврата 65 (код ошибки).

fi

filename=$1

if [ ! -f "$filename" ] # Кавычки необходимы на тот случай, если имя файла содержит пробелы.

then

echo "Файл $filename не найден!" >&2

# Сообщение об ошибке на stderr.

exit $NOTFOUND

fi

if [ ${filename##*.} != "gz" ]

# Квадратные скобки нужны для выполнения подстановки значения переменной

then

echo "Файл $1 не является gz-файлом!"

exit $NOTGZIP

fi

zcat $1 | most

# Используется утилита 'most' (очень похожа на 'less').

# Последние версии 'most' могут просматривать сжатые файлы.

# Можно вставить 'more' или 'less', если пожелаете.

exit $? # Сценарий возвращает код возврата, полученный по конвейеру.

# На самом деле команда "exit $?" не является обязательной,

# так как работа скрипта завершится здесь в любом случае,

построение сложных условий проверки

-a

логическое И (and)

exp1 -a exp2 возвращает true, если оба выражения, и exp1, и exp2 истинны.

-o

логическое ИЛИ (or)

exp1 -o exp2 возвращает true, если хотябы одно из выражений, exp1 или exp2 истинно.

Они похожи на операторы Bash && и ||, употребляемые в двойных квадратных скобках.

[[ condition1 && condition2 ]]

Операторы -o и -a употребляются совместно с командой test или внутри одинарных квадратных скобок.

if [ "$exp1" -a "$exp2" ]

Чтобы увидеть эти операторы в действии, смотрите Пример 8-3 и Пример 25-11.

7.4. Вложенные условные операторы if/then

Операторы проверки условий if/then могут быть вложенными друг в друга. Конечный результат будет таким же как если бы результаты всех проверок были объединены оператором &&.

if [ condition1 ]

then

if [ condition2 ]

then

do-something # Только если оба условия "condition1" и "condition2" истинны.

fi

fi

См. Пример 34-4 -- пример использования вложенных операторов if/then.

7.5. Проверка степени усвоения материала

Для запуска X-сервера может быть использован файл xinitrc. Этот файл содержит некоторое число операторов if/then. Ниже приводится отрывок из этого файла.

if [ -f $HOME/.Xclients ]; then

exec $HOME/.Xclients

elif [ -f /etc/X11/xinit/Xclients ]; then

exec /etc/X11/xinit/Xclients

else

# failsafe settings. Although we should never get here

# (we provide fallbacks in Xclients as well) it can't hurt.

xclock -geometry 100x100-5+5 &

xterm -geometry 80x50-50+150 &

if [ -f /usr/bin/netscape -a -f /usr/share/doc/HTML/index.html ]; then

netscape /usr/share/doc/HTML/index.html &

fi

fi

Объясните действия условных операторов в вышеприведенном отрывке, затем просмотрите файл /etc/X11/xinit/xinitrc и проанализируйте его. Возможно вам придется обратиться к разделам, посвященным grep, sed и регулярным выражениям.

Глава 8. Операции и смежные темы

8.1. Операторы

присваивание

variable assignment

Инициализация переменной или изменение ее значения

=

Универсальный оператор присваивания, пригоден как для сравнения целых чисел, так и для сравнения строк.

var=27

category=minerals # Пробелы до и после оператора "=" -- недопустимы.

Пусть вас не смущает, что оператор присваивания ("="), по своему внешнему виду, совпадает с оператором сравнения (=).

# Здесь знак "=" выступает в качестве оператора сравнения

if [ "$string1" = "$string2" ]

# if [ "X$string1" = "X$string2" ] более отказоустойчивый вариант,

# предохраняет от "сваливания" по ошибке в случае, когда одна из переменных пуста.

# (добавленные символы "X" компенсируют друг друга.)

then

command

fi

арифметические операторы

+

сложение

-

вычитание

*

умножение

/

деление

**

возведение в степень

# В Bash, начиная с версии 2.02, был введен оператор возведения в степень -- "**".

let "z=5**3"

echo "z = $z" # z = 125

%

модуль (деление по модулю), возвращает остаток от деления

bash$ echo `expr 5 % 3`

2

Этот оператор может применяться в алгоритмах генерации псевдослучайных чисел в заданном диапазоне (см. Пример 9-23 и Пример 9-25), для форматирования вывода на экран (см. Пример 25-10 и Пример A-7), и даже для генерации простых чисел (см. Пример A-18). На удивление часто операцию деления по модулю можно встретить в различных численных алгоритмах.

Пример 8-1. Наибольший общий делитель

#!/bin/bash

# gcd.sh: поиск наибольшего общего делителя

# по алгоритму Эвклида

# Под "наибольшим общим делителем" (нод) двух целых чисел

#+ понимается наибольшее целое число, которое делит оба делимых без остатка.

# Алгоритм Эвклида выполняет последовательное деление.

# В каждом цикле,

#+ делимое <--- делитель

#+ делитель <--- остаток

#+ до тех пор, пока остаток не станет равным нулю (остаток = 0).

#+ The gcd = dividend, on the final pass.

#

# Замечательное описание алгоритма Эвклида можно найти

# на сайте Jim Loy, http://www.jimloy.com/number/euclids.htm.

# ------------------------------------------------------

# Проверка входных параметров

ARGS=2

E_BADARGS=65

if [ $# -ne "$ARGS" ]

then

echo "Порядок использования: `basename $0` первое-число второе-число"

exit $E_BADARGS

fi

# ------------------------------------------------------

gcd ()

{

# Начальное присваивание.

dividend=$1 # В сущности, не имеет значения

divisor=$2 #+ какой из них больше.

# Почему?

remainder=1 # Если переменные неинициализировать,

1 ... 9 10 11 12 13 14 15 16 17 ... 96
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Искусство программирования на языке сценариев командной оболочки - Мендель Купер.
Книги, аналогичгные Искусство программирования на языке сценариев командной оболочки - Мендель Купер

Оставить комментарий