Библиотека сайта rus-linux.net
Руководство по 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 |