Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 10: Подробнее о переменных Вперед

Операции над переменными

Арифметические операции над переменными

Мы уже обсуждали эти операции в разделе "Арифметические выражения".

Длина строки в переменной

С помощью конструкции ${#VAR} можно вычислить количество символов в переменной. Если вместо VAR указывается "*" или "@", то обычное значение заменяется на количество позиционных параметров или количество элементов в массиве. Это показано в приведенном ниже примере:

[bob in ~] echo $SHELL
/bin/bash

[bob in ~] echo ${#SHELL}
9

[bob in ~] ARRAY=(seven two five)

[bob in ~] echo ${#ARRAY[*]}
3

Преобразование переменных

Замена

${VAR:-WORD} 

Если VAR не определено или его значение не задано, то подставляется значение WORD, в противном случае подставляется значение VAR:

[bob in ~] echo ${TEST:-test}
test

[bob in ~] echo $TEST
 

[bob in ~] export TEST=a_string

[bob in ~] echo ${TEST:-test}
a_string

[bob in ~] echo ${TEST2:-$TEST}
a_string

Эта форма часто используется в условных проверках, например, следующим образом:

[ -z "${COLUMNS:-}" ] && COLUMNS=80

Это сокращенная нотация следующего варианта

if [ -z "${COLUMNS:-}" ]; then
        COLUMNS=80
fi

Дополнительную информацию об этом типе условных проверок смотрите в разделе "Сравнение строк".

Если символ дефиса (-) заменяется на знак равенства (=), то в случае, если параметр не имеет значения, параметру присваивается значение:

[bob in ~] echo $TEST2


[bob in ~] echo ${TEST2:=$TEST}
a_string

[bob in ~] echo $TEST2
a_string

В следующих примерах проверяется существование переменной. Если значение переменной не задано, то в стандартный вывод выдается подставляемое слово WORD и в неинтерактивном режиме происходит выход из скрипта. Смотрите:

[bob in ~] cat vartest.sh
#!/bin/bash
 
# This script tests whether a variable is set.  If not,
# it exits printing a message.
 
echo ${TESTVAR:?"There's so much I still wanted to do..."}
echo "TESTVAR is set, we can proceed."

[bob in testdir] ./vartest.sh
./vartest.sh: line 6: TESTVAR: There's so much I still wanted to do...

[bob in testdir] export TESTVAR=present

[bob in testdir] ./vartest.sh
present
TESTVAR is set, we can proceed.

Если вместо восклицательного знака используется "+", переменной будет присвоено значение, подставляемое в WORD; если оно отсутствует, то ничего не происходит.

Удаление подстрок

Чтобы из переменной удалить число символов, равное OFFSET, используйте следующую конструкцию:

${VAR:OFFSET:LENGTH} 

Параметр LENGTH определяет, сколько символов следует сохранить, начиная с первого оставшегося символа. Если параметр LENGTH опущен, то сохраняется оставшаяся часть значения переменной:

[bob in ~] export STRING="thisisaverylongname"

[bob in ~] echo ${STRING:4}
isaverylongname

[bob in ~] echo ${STRING:6:5}
avery
Конструкции
${VAR#WORD} 
и
${VAR##WORD} 
используются для удаления из строки VAR подстроки по шаблону WORD. Шаблон WORD используется точно также, как и при подстановке имен файлов. Если при анализе строки из VAR будет найдено соответствие, то из VAR будет выполнено удаление по шаблону; причем если указывается "#", то удаляется минимальная подстрока, соответствующая шаблону, если указывается "##", то удаляется максимальная подстрока, соответствующая шаблону.

Если для VAR указывается "*" или "@", операция удаления по шаблону поочередно применяется к каждому позиционному параметру.

Если VAR является массивом переменных и указаны "*" или "@", то операция удаления по шаблону поочередно применяется к каждому элементу массива. Это показывается ниже в следующем примере:

[bob in ~] echo ${ARRAY[*]}
one two one three one four

[bob in ~] echo ${ARRAY[*]#one}
two three four

[bob in ~] echo ${ARRAY[*]#t}
one wo one hree one four

[bob in ~] echo ${ARRAY[*]#t*}
one wo one hree one four

[bob in ~] echo ${ARRAY[*]##t*}
one one one four

Иной эффект можно получить с помощью "%" и "%%", как это показано в примере, приведенном ниже. Соответствие WORD ищется с конца строки:

[bob in ~] echo $STRING
thisisaverylongname

[bob in ~] echo ${STRING%name}
thisisaverylong

Замена строковых фрагментов в содержимом переменных

Это делается с помощью

${VAR/PATTERN/STRING} 

или с помощью

${VAR//PATTERN/STRING} 

В первом случае замена происходит только для первого вхождения, во втором случае все вхождения PATTERN заменяются на STRING:

[bob in ~] echo ${STRING/name/string}
thisisaverylongstring

Более подробную информацию можно найти в документации по Bash.


Предыдущий раздел: Оглавление Следующий раздел:
Переменные массивы   Подводим итог главы 10