| Вычисление выражения | Описания |
|---|---|
| Выражение1 | Выражение2 | Выражение1, еслиВыражение1 не равно нулю, в противном случаеВыражение2 |
| Выражение1 & Выражение2 | Нуль, если оба выражения равны нулю, в противном случаеВыражение1 |
| Выражение1 = Выражение2 | Равенство |
| Выражение1 > Выражение2 | Больше чем |
| Выражение1 >= Выражение2 | Больше или равно |
| Выражение1 < Выражение2 | Меньше чем |
| Выражение1 <= Выражение2 | Меньше или равно |
| Выражение1 != Выражение2 | Неравенство |
| Выражение1 + Выражение2 | Сложение |
| Выражение1 - Выражение2 | Вычитание |
| Выражение1 * Выражение2 | Умножение |
| Выражение1 / Выражение2 | Деление нацело |
| Выражение1 % Выражение2 | Остаток от деления нацело |
В современных сценариях вместо команды expr обычно применяется более эффективная синтаксическая конструкция $((...)), которая будет описана далее в этой главе.
printf
Команда printf есть только в современных командных оболочках. Группа X/Open полагает, что ее следует применять вместо команды echo для генерации форматированного вывода, несмотря на то, что, кажется, лишь немногие следуют этому совету.
У команды следующая синтаксическая запись.
printf "строка формата" параметр1 параметр2 ...
Строка формата очень похожа с некоторыми ограничениями на применяемую в языках программирования С и С++. Главным образом не поддерживаются числа с плавающей точкой, поскольку все арифметические операции в командной оболочке выполняются над целыми числами. Строка формата состоит из произвольной комбинации литеральных символов, escape-последовательностей и спецификаторов преобразования. Все символы строки формата, отличающиеся от \ и %, отображаются на экране при выводе.
В табл. 2.7 приведены поддерживаемые командой escape-последовательности.
Таблица 2.7
| Escape-последовательность | Описание |
|---|---|
| \" | Двойная кавычка |
| \\ | Символ обратный слэш |
| \a | Звуковой сигнал тревоги (звонок колокольчика или прерывистый звуковой сигнал) |
| \b | Символ Backspace (стирание слева) |
| \c | Отбрасывание последующего вывода |
| \f | Символ Form feed (подача бумаги) |
| \n | Символ перехода на новую строку |
| \r | Возврат каретки |
| \t | Символ табуляции |
| \v | Символ вертикальной табуляции |
| \ooo | Один символ с восьмеричным значением ooo |
| \xHH | Один символ с шестнадцатеричным значением HH |
Спецификаторы преобразований довольно сложны, поэтому мы приведем наиболее распространенные варианты их применения. Более подробную информацию можно найти в интерактивном справочном руководстве командной оболочки bash или на страницах раздела 1 интерактивного руководства к команде printf (man 1 printf). (Если вы не найдете нужных сведений в разделе 1, попробуйте поискать в разделе 3.) Спецификатор преобразования состоит из символа %, за которым следует символ преобразования. Основные варианты преобразований перечислены в табл. 2.8.
Таблица 2.8
| Символ преобразования | Описание |
|---|---|
| D | Вывод десятичного числа |
| С | Вывод символа |
| S | Вывод строки |
| % | Вывод знака % |
Строка формата используется для интерпретации остальных параметров команды и вывода результата, как показано в следующем примере:
$ printf "%s\n" hello
hello
$ printf "%s %d\t%s" "Hi There" 15 people
Hi There 15 people
Обратите внимание на то, что для защиты строки Hi There и превращения ее в единый параметр, строку нужно заключить в кавычки ("").
return
Команда return служит для возврата значений из функций, как уже упоминалось ранее при обсуждении функций. Команда принимает один числовой параметр, который становится доступен в сценарии, вызывающем функцию. Если параметр не задан, команда return по умолчанию возвращает код завершения последней команды.
set
Команда set задает переменные-параметры командной оболочки. Она может быть полезна при использовании полей в командах, выводящих значения, разделенные пробелами.
Предположим, что вы хотите использовать в сценарии название текущего месяца. В системе есть команда date, содержащая название месяца в виде строки, но нужно отделить его от других полей. Это можно сделать с помощью комбинации команды set и конструкции $(...), которые обеспечат выполнение команды date и возврат результата (более подробно об этом см. далее). В выводе команды date строка с названием месяца - второй параметр.
#!/bin/sh
echo the date is $(date)
set $(date)
echo The month is $2
exit 0
Программа задает список параметров для вывода команды date и затем использует позиционный параметр $2 для получения названия месяца.
Мы использовали команду date только как простой пример, демонстрирующий, как извлекать позиционные параметры. Поскольку команда date зависит от языковых параметров или локализации, в действительности мы бы извлекли название месяца командой date +%B. У команды date много других вариантов форматирования, более подробную информацию см. на страницах интерактивного справочного руководства к команде.
Команду set можно также применять для передачи параметров командной оболочке и тем самым управления режимом ее работы. Наиболее часто используемый вариант команды set -х, который заставляет сценарий выводить на экран трассировку выполняемой в данный момент команды. Мы обсудим команду set и ее дополнительные опции позже в этой главе, когда будем рассматривать отладку программ.
shift
Команда shift сдвигает все переменные-параметры на одну позицию назад, так что параметр $2 становится параметром $1, параметр $3 - $2 и т.д. Предыдущее значение параметра $1 отбрасывается, а значение параметра $0 остается неизменным. Если в вызове команды shift задан числовой параметр, параметры сдвигаются на указанное количество позиций. Остальные переменные $*, $@ и $# также изменяются в связи с новой расстановкой переменных-параметров.
Команда shift часто полезна при поочередном просмотре параметров, переданных в сценарий, и если вашему сценарию требуется 10 и более параметров, вам понадобится команда shift для обращения к 10-му параметру и следующим за ним.
Например, вы можете просмотреть все позиционные параметры:
#!/bin/sh
while [ "$1" != "" ]; do
echo "$1"
shift
done
exit 0