Выбрать главу

################

for directory in $directorys; do

if [ -d $directory ]

then linkchk $directory

else

echo "$directory не является каталогом"

echo "Порядок использования: $0 dir1 dir2 ..."

fi

done

exit 0

Пример 28-1, Пример 10-7, Пример 10-3, Пример 28-3 и Пример A-2 так же иллюстрируют операции проверки файлов.

7.3. Операции сравнения

сравнение целых чисел

-eq

равно

if [ "$a" -eq "$b" ]

-ne

не равно

if [ "$a" -ne "$b" ]

-gt

больше

if [ "$a" -gt "$b" ]

-ge

больше или равно

if [ "$a" -ge "$b" ]

-lt

меньше

if [ "$a" -lt "$b" ]

-le

меньше или равно

if [ "$a" -le "$b" ]

<

меньше (внутри двойных круглых скобок )

(("$a" < "$b"))

<=

меньше или равно (внутри двойных круглых скобок)

(("$a" <= "$b"))

>

больше (внутри двойных круглых скобок)

(("$a" > "$b"))

>=

больше или равно (внутри двойных круглых скобок)

(("$a" >= "$b"))

сравнение строк

=

равно

if [ "$a" = "$b" ]

==

равно

if [ "$a" == "$b" ]

Синоним оператора =.

[[ $a == z* ]] # истина, если $a начинается с символа "z" (сравнение по шаблону)

[[ $a == "z*" ]] # истина, если $a равна z*

[ $a == z* ] # имеют место подстановка имен файлов и разбиение на слова

[ "$a" == "z*" ] # истина, если $a равна z*

# Спасибо S.C.

!=

не равно

if [ "$a" != "$b" ]

Этот оператор используется при поиске по шаблону внутри [[ ... ]].

<

меньше, в смысле величины ASCII-кодов

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ]

Обратите внимание! Символ "<" необходимо экранировать внутри [ ].

>

больше, в смысле величины ASCII-кодов

if [[ "$a" > "$b" ]]

if [ "$a" \> "$b" ]

Обратите внимание! Символ ">" необходимо экранировать внутри [ ].

См. Пример 25-6 относительно применения этого оператора сравнения.

-z

строка "пустая", т.е. имеет нулевую длину

-n

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

Оператор -n требует, чтобы строка была заключена в кавычки внутри квадратных скобок. Как правило, проверка строк, не заключенных в кавычки, оператором ! -z, или просто указание строки без кавычек внутри квадратных скобок (см. Пример 7-6), проходит нормально, однако это небезопасная, с точки зрения отказоустойчивости, практика. Всегда заключайте проверяемую строку в кавычки[ 18 ].

Пример 7-5. Операции сравнения

#!/bin/bash

a=4

b=5

# Здесь переменные "a" и "b" могут быть как целыми числами, так и строками.

# Здесь наблюдается некоторое размывание границ

#+ между целочисленными и строковыми переменными,

#+ поскольку переменные в Bash не имеют типов.

# Bash выполняет целочисленные операции над теми переменными,

#+ которые содержат только цифры

# Будьте внимательны!

echo

if [ "$a" -ne "$b" ]

then

echo "$a не равно $b"

echo "(целочисленное сравнение)"

fi

echo

if [ "$a" != "$b" ]

then

echo "$a не равно $b."

echo "(сравнение строк)"

# "4" != "5"

# ASCII 52 != ASCII 53

fi

# Оба варианта, "-ne" и "!=", работают правильно.

echo

exit 0

Пример 7-6. Проверка -- является ли строка пустой

#!/bin/bash

# str-test.sh: Проверка пустых строк и строк, не заключенных в кавычки,

# Используется конструкция if [ ... ]

# Если строка не инициализирована, то она не имеет никакого определенного значения.

# Такое состояние называется "null" (пустая) (это не то же самое, что ноль).

if [ -n $string1 ] # $string1 не была объявлена или инициализирована.

then

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

else

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

fi

# Неверный результат.

# Выводится сообщение о том, что $string1 не пустая,

вернуться

18

Как указывает S.C., даже заключение строки в кавычки, при построении сложных условий проверки, может оказаться недостаточным. [ -n "$string" -o "$a" = "$b" ] в некоторых версиях Bash такая проверка может вызвать сообщение об ошибке, если строка $string пустая. Безопаснее, в смысле отказоустойчивости, было бы добавить какой-либо символ к, возможно пустой, строке: [ "x$string" != x -o "x$a" = "x$b" ] (символ "x" не учитывается).