<Предыдущая | Содержание: | Следующая>
Неожиданные расширения
Возможны ошибки, которые возникают в сценарии только периодически. Иногда сценарий будет работать нормально, а в других случаях он не удастся из-за результатов расширения. Если мы вернем пропущенную точку с запятой и изменим значение номер к пустой переменной, мы
может продемонстрировать:
#! / Bin / Баш
# проблема: скрипт для демонстрации типичных ошибок
число =
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
#! / Bin / Баш
# проблема: скрипт для демонстрации типичных ошибок
число =
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
Запуск сценария с этим изменением приводит к выводу:
[я @ linuxbox ~] $ беда
/ home / me / bin / Trouble: строка 7: [: =: ожидаемый унарный оператор Число не равно 1.
[я @ linuxbox ~] $ беда
/ home / me / bin / Trouble: строка 7: [: =: ожидаемый унарный оператор Число не равно 1.
Мы получаем это довольно загадочное сообщение об ошибке, за которым следует вывод второго эхо команда. Проблема заключается в расширении номер переменная в пределах тестXNUMX команда. Когда команда:
[$ number = 1]
[$ number = 1]
подвергается расширению с номер будучи пустым, результат следующий:
[= 1]
[= 1]
который является недопустимым, и возникает ошибка. В = Оператор является бинарным оператором (для него требуется значение с каждой стороны), но первое значение отсутствует, поэтому тестXNUMX команда ожидает унарный оператор (например, -z) вместо. Далее, поскольку тестXNUMX не удалось (из-за ошибки), if команда получает ненулевой код выхода и действует соответственно, а вторая эхо команда выполняется.
Эту проблему можно исправить, добавив кавычки вокруг первого аргумента в тестXNUMX
команда:
["$ number" = 1]
["$ number" = 1]
Затем, когда произойдет расширение, результат будет следующим:
["" = 1]
["" = 1]
что дает правильное количество аргументов. В дополнение к пустым строкам следует использовать кавычки в тех случаях, когда значение может расширяться до строк из нескольких слов, например, с именами файлов, содержащими встроенные пробелы.