Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

– n

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

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

18

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

Пример 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 не пустая,

#+не смотря на то, что она не была инициализирована.

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

Поделиться с друзьями: