KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

Мендель Купер - Искусство программирования на языке сценариев командной оболочки

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

${parameter}

То же самое, что и $parameter, т.е. значение переменной parameter. В отдельных случаях, при возникновении неоднозначности интерпретации, корректно будет работать только такая форма записи: ${parameter}.

Может использоваться для конкатенации (слияния) строковых переменных.

your_id=${USER}-on-${HOSTNAME}

echo "$your_id"

#

echo "Старый $PATH = $PATH"

PATH=${PATH}:/opt/bin #Добавление /opt/bin в $PATH.

echo "Новый $PATH = $PATH"


${parameter-default}, ${parameter:-default}

Если параметр отсутствует, то используется значение по-умолчанию.

echo ${username-`whoami`}

# Вывод результата работы команды `whoami`, если переменная $username не установлена.


Формы записи ${parameter-default} и ${parameter:-default} в большинстве случаев можно считать эквивалентными. Дополнительный символ : имеет значение только тогда, когда parameter определен, но имеет "пустое" (null) значение.

#!/bin/bash


username0=

# переменная username0 объявлена, но инициализирована "пустым" значением.

echo "username0 = ${username0-`whoami`}"

# Вывод после символа "=" отсутствует.


echo "username1 = ${username1-`whoami`}"

# Переменная username1 не была объявлена.

# Выводится имя пользователя, выданное командой `whoami`.


username2=

# переменная username2 объявлена, но инициализирована "пустым" значением.

echo "username2 = ${username2:-`whoami`}"

# Выводится имя пользователя, выданное командой `whoami`, поскольку

#+здесь употребляется конструкция ":-" , а не "-".


exit 0


Параметры по-умолчанию очень часто находят применение в случаях, когда сценарию необходимы какие либо входные аргументы, передаваемые из командной строки, но такие аргументы не были переданы.

DEFAULT_FILENAME=generic.data

filename=${1:-$DEFAULT_FILENAME}

# Если имя файла не задано явно, то последующие операторы будут работать

#+ с файлом "generic.data".

#


см. так же Пример 3-4, Пример 28-2 и Пример A-7.

Сравните этот подход с методом списков and list, для задания параметров командной строки по-умолчанию .

${parameter=default}, ${parameter:=default}

Если значения параметров не задананы явно, то они принимают значения по-умолчанию.

Оба метода задания значений по-умолчанию до определенной степени идентичны. Символ : имеет значение только когда $parameter был инициализирован "пустым" (null) значением[ 22 ], как показано выше.

echo ${username=`whoami`}

# Переменная "username" принимает значение, возвращаемое командой `whoami`.


${parameter+alt_value}, ${parameter:+alt_value}

Если параметр имеет какое либо значение, то используется alt_value, иначе -- null ("пустая" строка).

Оба варианта до определенной степени идентичны. Символ : имеет значение только если parameter объявлен и "пустой", см. ниже.

echo "###### ${parameter+alt_value} ########"

echo


a=${param1+xyz}

echo "a = $a" # a =


param2=

a=${param2+xyz}

echo "a = $a" # a = xyz


param3=123

a=${param3+xyz}

echo "a = $a" # a = xyz


echo

echo "###### ${parameter:+alt_value} ########"

echo


a=${param4:+xyz}

echo "a = $a" # a =


param5=

a=${param5:+xyz}

echo "a = $a" # a =

# Вывод отличается от a=${param5+xyz}


param6=123

a=${param6+xyz}

echo "a = $a" # a = xyz


${parameter?err_msg}, ${parameter:?err_msg}

Если parameter инициализирован, то используется его значение, в противном случае -- выводится err_msg.

Обе формы записи можно, до определенной степени, считать идентичными. Символ : имеет значение только когда parameter инициализирован "пустым" значением, см. ниже.

Пример 9-13. Подстановка параметров и сообщения об ошибках

#!/bin/bash


# Проверка отдельных переменных окружения.

# Если переменная, к примеру $USER, не установлена,

#+ то выводится сообщение об ошибке.


: ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL?}

echo

echo "Имя машины: $HOSTNAME."

echo "Ваше имя: $USER."

echo "Ваш домашний каталог: $HOME."

echo "Ваш почтовый ящик: $MAIL."

echo

echo "Если перед Вами появилось это сообщение,"

echo "то это значит, что все критические переменные окружения установлены."

echo

echo


# ------------------------------------------------------


# Конструкция ${variablename?} так же выполняет проверку

#+ наличия переменной в сценарии.


ThisVariable=Value-of-ThisVariable

# Обратите внимание, в строковые переменные могут быть записаны

#+ символы, которые запрещено использовать в именах переменных.

: ${ThisVariable?}

echo "Value of ThisVariable is $ThisVariable".

echo

echo


: ${ZZXy23AB?"Переменная ZZXy23AB не инициализирована."}

# Если ZZXy23AB не инициализирована,

#+ то сценарий завершается с сообщением об ошибке.


# Текст сообщения об ошибке можно задать свой.

# : ${ZZXy23AB?"Переменная ZZXy23AB не инициализирована."}


# То же самое: dummy_variable=${ZZXy23AB?}

# dummy_variable=${ZZXy23AB?"Переменная ZXy23AB не инициализирована."}

#

# echo ${ZZXy23AB?} >/dev/null


echo "Это сообщение не будет напечатано, поскольку сценарий завершится раньше."


HERE=0

exit $HERE # Сценарий завершит работу не здесь.

Пример 9-14. Подстановка параметров и сообщение о "порядке использования"

#!/bin/bash

# usage-message.sh


: ${1?"Порядок использования: $0 ARGUMENT"}

# Сценарий завершит свою работу здесь, если входные аргументы отсутствуют,

#+ со следующим сообщением.

# usage-message.sh: 1: Порядок использования: usage-message.sh ARGUMENT


echo "Эти две строки появятся, только когда задан аргумент в командной строке."

echo "Входной аргумент командной строки = "$1""


exit 0 # Точка выхода находится здесь, только когда задан аргумент командной строки.


# Проверьте код возврата в обеих случаях, с и без аргумента командной строки.

# Если аргумент задан, то код возврата будет равен 0.

# Иначе -- 1.

Подстановка параметров и/или экспансия. Следующие выражения могут служить дополнениями оператора match команды expr, применяемой к строкам (см. Пример 12-6). Как правило, они используются при разборе имен файлов и каталогов.

Длина переменной / Удаление подстроки

${#var}

String length (число символов в переменной $var). В случае массивов, команда ${#array} возвращает длину первого элемента массива.

Исключения:

${#*} и ${#@} возвращает количество аргументов (позиционных параметров).

 Для массивов, ${#array[*]} и ${#array[@]} возвращает количество элементов в массиве.


Пример 9-15. Длина переменной

#!/bin/bash

# length.sh


E_NO_ARGS=65


if [ $# -eq 0 ] # Для работы скрипта необходим хотя бы один входной параметр.

then

echo "Вызовите сценарий с одним или более параметром командной строки."

exit $E_NO_ARGS

fi


var01=abcdEFGH28ij


echo "var01 = ${var01}"

echo "Length of var01 = ${#var01}"


echo "Количество входных параметров = ${#@}"

echo "Количество входных параметров = ${#*}"


exit 0

${var#Pattern}, ${var##Pattern}

Удаляет из переменной $var наименьшую/наибольшую подстроку, совпадающую с шаблоном $Pattern. Поиск ведется с начала строки $var.

Пример использования из Пример A-8:

# Функцмя из сценария "days-between.sh".

# Удаляет нули, стоящие в начале аргумента-строки.


strip_leading_zero () # Ведущие нули, которые согут находиться в номере дня/месяца,

# лучше удалить

val=${1#0} # В противном случае Bash будет интерпретировать числа

return $val # как восьмеричные (POSIX.2, sect 2.9.2.1).

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*