| Руководство по 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 |