Командная строка Linux
Шрифт:
выполняют поиск с заменой в содержимом указанного параметра. Если в параметре будет найдено совпадение с шаблоном, который может содержать групповые символы, это совпадение будет заменено содержимым указанной строки. Первая форма заменит только первое совпадение с шаблоном. Форма // заменит все найденные совпадения. Форма /# выполняет замену, только если совпадение с шаблоном найдено в самом начале строки, а форма /% выполняет замену, только если совпадение найдено в конце строки. Часть /строка можно опустить, и тогда совпавший фрагмент будет удален.
[me@linuxbox ~]$ foo=JPG.JPG
[me@linuxbox ~]$ echo ${foo/JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ echo ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox ~]$ echo ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ echo ${foo/%JPG/jpg}
JPG.jpg
Механизм
#!/bin/bash
# longest-word3 : поиск самой длинной строки в файле
for i; do
if [[ -r $i ]]; then
max_word=
max_len=
for j in $(strings $i); do
len=${#j}
if (( len > max_len )); then
max_len=$len
max_word=$j
fi
done
echo "$i: '$max_word' ($max_len characters)"
fi
shift
done
Далее, сравним эффективность двух версий с помощью команды time:
[me@linuxbox ~]$ time longest-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 characters)
real 0m3.618s
user 0m1.544s
sys 0m1.768s
[me@linuxbox ~]$ time longest-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 characters)
real 0m0.060s
user 0m0.056s
sys 0m0.008s
Первоначальной версии потребовалось 3,618 секунды, чтобы просканировать текстовый файл, тогда как новой версии, использующей механизм подстановки параметров, понадобилось всего 0,06 секунды — весьма существенное улучшение.
Вычисление и подстановка арифметических выражений
В главе 7 мы видели, как работает механизм подстановки результатов арифметических выражений. Он используется для выполнения разных арифметических операций с целыми числами. Ниже приводится его базовый синтаксис
$((выражение))
где выражение — это любое допустимое арифметическое выражение.
Он тесно связан с составной командой , использовавшейся в главе 27 для вычисления арифметических выражений (оценки истинности).
В предыдущих главах мы видели некоторые наиболее типичные выражения и операторы, а здесь рассмотрим
Основание системы счисления
В главе 9 мы познакомились с восьмеричными (в системе счисления с основанием 8) и шестнадцатеричными (в системе счисления с основанием 16) числами. В арифметических выражениях командная оболочка позволяет использовать целочисленные константы в системах счисления с любым основанием. В табл. 34.1 показаны формы записи чисел с указанием основания системы счисления.
Таблица 34.1. Определение основания системы счисления
Форма записи
Описание
Число
По умолчанию числа без упоминания системы счисления интерпретируются как десятичные числа (в системе счисления с основанием 10)
0число
В арифметических выражениях числа, начинающиеся с нуля, интерпретируются как восьмеричные (в системе счисления с основанием 8)
0xчисло
Форма записи шестнадцатеричных чисел
основание#число
Число в системе счисления с указанным основанием
Несколько примеров:
[me@linuxbox ~]$ echo $((0xff))
255
[me@linuxbox ~]$ echo $((2#11111111))
255
В этих примерах выводится значение шестнадцатеричного числа ff (наибольшее двухзначное число) и наибольшее восьмизначное двоичное число (в системе счисления с основанием 2).
Унарные операторы
Оболочка поддерживает два унарных оператора, + и -, используемых для обозначения положительных и отрицательных чисел соответственно.
Простая арифметика
В табл. 34.2 перечислены обычные арифметические операторы.
Таблица 34.2. Арифметические операторы
Оператор
Описание
+
Сложение
–
Вычитание
*
Умножение
/
Целочисленное деление
**
Степень числа
%
Деление по модулю (остаток от целочисленного деления)
Действия большинства из перечисленных операторов не вызывают вопросов, кроме целочисленного деления и деления по модулю, которые требуют дополнительного обсуждения.
Поскольку оболочка поддерживает только арифметические операции с целыми числами, результатом деления всегда будет целое число:
[me@linuxbox ~]$ echo $(( 5 / 2 ))
2
Это обстоятельство увеличивает важность операции определения остатка от деления:
[me@linuxbox ~]$ echo $(( 5 % 2 ))
1
Используя операторы деления и деления по модулю, можно определить, что деление 5 на 2 дает в результате 2 с остатком 1.
Вычисление остатка от деления удобно использовать в циклах. Это позволяет выполнять в цикле определенные операции с заданным интервалом. В примере ниже выводится строка чисел, в которой выделяются числа, кратные 5: