<Предыдущая | Содержание: | Следующая>
Назначение
Хотя его использование может быть не сразу очевидным, арифметические выражения могут выполнять присваивание. Мы выполняли задание много раз, но в другом контексте. Каждый раз, когда мы присваиваем переменной значение, мы выполняем присваивание. Мы также можем сделать это с помощью арифметических выражений:
[я @ linuxbox ~] $ foo =
[я @ linuxbox ~] $ эхо $ foo
[я @ linuxbox ~] $ если ((foo = 5)); затем echo «Это правда.»; фи
Это правда.
[я @ linuxbox ~] $ эхо $ foo
5
[я @ linuxbox ~] $ foo =
[я @ linuxbox ~] $ эхо $ foo
[я @ linuxbox ~] $ если ((foo = 5)); затем echo «Это правда.»; фи
Это правда.
[я @ linuxbox ~] $ эхо $ foo
5
В приведенном выше примере мы сначала присваиваем пустое значение переменной Foo и убедитесь, что он действительно пустой. Далее мы выполняем if с составной командой ((foo = 5
)). Этот процесс делает две интересные вещи: 1) он присваивает переменной значение 5.
foo, и 2) он оценивается как истина, потому что foo было присвоено ненулевое значение.
Примечание: Важно помнить точное значение = в выражении выше. Один = выполняет задание. фу = 5 говорит «сделать Foo равно 5 », а == оценивает эквивалентность. фу == 5 говорит «делает Foo равно 5? » Это обычная особенность многих языков программирования. В оболочке это может немного сбивать с толку, потому что тестXNUMX команда принимает один = для эквивалентности строк. Еще одна причина использовать более современные [[]] и (()) составные команды вместо тестXNUMX.
В дополнение к =, оболочка также предоставляет нотации, которые выполняют некоторые очень полезные функции:
Таблица 34-4: Операторы присваивания
Обозначение Описание
Обозначение Описание
параметр = ценностное Простое задание. Назначает ценностное в параметр.
параметр += ценностное Добавление. Эквивалентно параметр = параметр +
значения.
параметр -= ценностное Вычитание. Эквивалентно параметр = параметр –
значения.
параметр *= ценностное Умножение. Эквивалентно параметр = параметр
* значения.
параметр /= ценностное Целочисленное деление. Эквивалентно параметр =
параметр / значение.
параметр %= ценностное По модулю. Эквивалентно параметр = параметр %
значения.
параметр++ Переменный пост-инкремент. Эквивалентно параметр =
параметр + 1 (однако см. обсуждение ниже).
параметр−− Переменный постдекремент. Эквивалентно параметр =
параметр - 1.
++параметр Переменный предварительный инкремент. Эквивалентно параметр =
параметр + 1.
--параметр Переменный пре-декремент. Эквивалентно параметр =
параметр - 1.
Эти операторы присваивания обеспечивают удобное сокращение для многих распространенных арифметических задач. Особый интерес представляют инкремент (++) и декремент (-) операторы, увеличивающие или уменьшающие значение своих параметров на единицу. Этот стиль обозначений взят из языка программирования C и был включен в ряд других языков программирования, включая колотить.
Операторы могут появляться либо перед параметром, либо в конце. Хотя оба они либо увеличивают, либо уменьшают параметр на единицу, у этих двух мест размещения есть небольшая разница. Если он помещен в начало параметра, параметр увеличивается (или уменьшается) до того, как параметр будет возвращен. Если ставить после, операция выполняется после параметр возвращается. Это довольно странно, но это предполагаемое поведение. Вот демонстрация:
[я @ linuxbox ~] $ foo = 1 [я @ linuxbox ~] $ эхо $ ((foo ++)) 1
[я @ linuxbox ~] $ эхо $ foo
[я @ linuxbox ~] $ foo = 1 [я @ linuxbox ~] $ эхо $ ((foo ++)) 1
[я @ linuxbox ~] $ эхо $ foo
2
2
Если присвоить переменной значение единицы Foo а затем увеличьте его с помощью ++ оператор помещается после имени параметра, Foo возвращается со значением один. Однако, если мы посмотрим на значение переменной во второй раз, мы увидим увеличенное значение. Если мы разместим ++ оператор перед параметром, мы получаем более ожидаемое поведение:
[я @ linuxbox ~] $ foo = 1 [я @ linuxbox ~] $ эхо $ ((++ фу)) 2
[я @ linuxbox ~] $ эхо $ foo
2
[я @ linuxbox ~] $ foo = 1 [я @ linuxbox ~] $ эхо $ ((++ фу)) 2
[я @ linuxbox ~] $ эхо $ foo
2
Для большинства приложений оболочки использование префикса оператора будет наиболее полезным.
Операторы ++ и - часто используются вместе с циклами. Мы внесем некоторые улучшения в наш скрипт по модулю, чтобы немного его сжать:
#! / Bin / Баш
# modulo2: продемонстрировать оператор по модулю для ((i = 0; i <= 20; ++ я )); делать
если (((я% 5) == 0)); затем printf "<% d>" $ i
еще
printf "% d" $ i
фи сделано
printf "\ n"
#! / Bin / Баш
# modulo2: продемонстрировать оператор по модулю для ((i = 0; i <= 20; ++ я )); делать
если (((я% 5) == 0)); затем printf "<% d>" $ i
еще
printf "% d" $ i
фи сделано
printf "\ n"