Мендель Купер - Искусство программирования на языке сценариев командной оболочки
- Название:Искусство программирования на языке сценариев командной оболочки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Мендель Купер - Искусство программирования на языке сценариев командной оболочки краткое содержание
Данное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток, постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.
Искусство программирования на языке сценариев командной оболочки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
# Поиск совпадения с начала строки.
v1=${v0/#abc/ABCDEF} # abc1234zip1234abc
# |-|
echo "v1 = $v1" # ABCDE1234zip1234abc
# |---|
# Поиск совпадения с конца строки.
v2=${v0/%abc/ABCDEF} # abc1234zip123abc
# |-|
echo "v2 = $v2" # abc1234zip1234ABCDEF
# |----|
echo
# ----------------------------------------------------
# Если совпадение находится не с начала/конца строки,
#+ то замена не производится.
# ----------------------------------------------------
v3=${v0/#123/000} # Совпадение есть, но не в начале строки.
echo "v3 = $v3" # abc1234zip1234abc
# ЗАМЕНА НЕ ПРОИЗВОДТСЯ!
v4=${v0/%123/000} # Совпадение есть, но не в конце строки.
echo "v4 = $v4" # abc1234zip1234abc
# ЗАМЕНА НЕ ПРОИЗВОДТСЯ!
exit 0
${!varprefix*}, ${!varprefix@}
Поиск по шаблону всех, ранее объявленных переменных, имена которых начинаются с varprefix .
xyz23=whatever
xyz24=
a=${!xyz*} # Подстановка имен объявленных переменных, которые начинаются с "xyz".
echo "a = $a" # a = xyz23 xyz24
a=${!xyz@} # То же самое.
echo "a = $a" # a = xyz23 xyz24
# Эта возможность была добавлена в Bash, в версии 2.04.
9.4. Объявление переменных: declare и typeset
Инструкции declareи typesetявляются встроенными инструкциями (они абсолютно идентичны друг другу и являются синонимами) и предназначена для наложения ограничений на переменные. Это очень слабая попытка контроля над типами, которая имеется во многих языках программирования. Инструкция declareпоявилась в Bash, начиная с версии 2. Кроме того, инструкция typesetможет использоваться и в ksh-сценариях.
ключи инструкций declare/typeset
-r readonly (только для чтения)
declare -r var1
( declare -r var1аналогично объявлению readonly var1)
Это грубый эквивалент констант (const) в языке C. Попытка изменения таких переменных завершается сообщением об ошибке.
-i integer
declare -i number
# Сценарий интерпретирует переменную "number" как целое число.
number=3
echo "number = $number" # number = 3
number=three
echo "number = $number" # number = 0
# Строка "three" интерпретируется как целое число.
Примечательно, что допускается выполнение некоторых арифметических операций над переменными, объявленными как integer, не прибегая к инструкциям expr или let.
-a array
declare -a indices
Переменная indices объявляется массивом.
-f functions
declare -f
Инструкция declare -f, без аргументов, приводит к выводу списка ранее объявленных функций в сценарии.
declare -f function_name
Инструкция declare -f function_nameвыводит имя функции function_name, если она была объявлена ранее.
-x export
declare -x var3
Эта инструкция объявляет переменную, как доступную для экспорта.
var=$value
declare -x var3=373
Инструкция declareдопускает совмещение объявления и присваивания значения переменной одновременно.
Пример 9-20. Объявление переменных с помощью инструкции declare
#!/bin/bash
func1 ()
{
echo Это функция.
}
declare -f # Список функций, объявленных выше.
echo
declare -i var1 # var1 -- целочисленная переменная.
var1=2367
echo "переменная var1 объявлена как $var1"
var1=var1+1 # Допустимая арифметическая операция над целочисленными переменными.
echo "переменная var1 увеличена на 1 = $var1."
# Допустимая операция для целочисленных переменных
echo "Возможно ли записать дробное число 2367.1 в var1?"
var1=2367.1 # Сообщение об ошибке, переменная не изменяется.
echo "значение переменной var1 осталось прежним = $var1"
echo
declare -r var2=13.36 # инструкция 'declare' допускает установку свойств переменной
#+ и одновременно присваивать значение.
echo "var2 declared as $var2" # Допускается ли изменять значение readonly переменных?
var2=13.37 # Сообщение об ошибке и завершение работы сценария.
echo "значение переменной var2 осталось прежним $var2" # Эта строка никогда не будет выполнена.
exit 0 # Сценарий завершит работу выше.
9.5. Косвенные ссылки на переменные
Предположим, что значение одной переменной -- есть имя второй переменной. Возможно ли получить значение второй переменной через обращение к первой? Например, Пусть a=letter_of_alphabet и letter_of_alphabet=z , тогда вопрос будет звучать так: "Возможно ли получить значение z , обратившись к переменной a ?". В действительности это возможно и это называется косвенной ссылкой . Для этого необходимо прибегнуть к несколько необычной нотации eval var1=\$$var2 .
Пример 9-21. Косвенные ссылки
#!/bin/bash
# Косвенные ссылки на переменные.
a=letter_of_alphabet
letter_of_alphabet=z
echo
# Прямое обращение к переменной.
echo "a = $a"
# Косвенное обращение к переменной.
eval a=\$$a
echo "А теперь a = $a"
echo
# Теперь попробуем изменить переменную, на которую делается ссылка.
t=table_cell_3
table_cell_3=24
echo "\"table_cell_3\" = $table_cell_3"
echo -n "разыменование (получение ссылки) \"t\" = "; eval echo \$$t
# В данном, простом, случае,
# eval t=\$$t; echo "\"t\" = $t"
# дает тот же результат (почему?).
echo
t=table_cell_3
NEW_VAL=387
table_cell_3=$NEW_VAL
echo "Значение переменной \"table_cell_3\" изменено на $NEW_VAL."
echo "Теперь \"table_cell_3\" = $table_cell_3"
echo -n "разыменование (получение ссылки) \"t\" = "; eval echo \$$t
# инструкция "eval" принимает два аргумента "echo" и "\$$t" (назначает равным $table_cell_3)
echo
# (Спасибо S.C. за разъяснения.)
# Еще один способ -- нотация ${!t}, будет обсуждаться в разделе "Bash, версия 2".
# Так же, см. пример "ex78.sh".
exit 0
Пример 9-22. Передача косвенных ссылок в awk
#!/bin/bash
# Другая версия сценария "column totaler"
# который суммирует заданную колонку (чисел) в заданном файле.
# Здесь используются косвенные ссылки.
ARGS=2
E_WRONGARGS=65
if [ $# -ne "$ARGS" ] # Проверка количества входных аргументов.
then
echo "Порядок использования: `basename $0` filename column-number"
exit $E_WRONGARGS
fi
filename=$1
column_number=$2
#===== До этой строки идентично первоначальному варианту сценария =====#
# Мнгострочные скрипты awk вызываются конструкцией awk ' ..... '
# Начало awk-сценария.
# ------------------------------------------------
awk "
{ total += \$${column_number} # косвенная ссылка
}
END {
print total
}
" "$filename"
# ------------------------------------------------
# Конец awk-сценария.
# Косвенные ссылки делают возможным бесконфликтное
# обращение к переменным shell внутри вложенных сценариев awk.
# Спасибо Stephane Chazelas.
exit 0
Такой метод обращения к переменным имеет свои особенности. Если переменная, на которую делается ссылка, меняет свое значение, то переменная которая ссылается, должна быть должным образом разыменована, т.е. олжна быть выполнена операция получения ссылки, как это делается в примере выше. К счастью, нотация ${!variable} , введенная в Bash, начиная с версии 2 (см. Пример 34-2) позволяет выполнять косвенные ссылки более интуитивно понятным образом.
Интервал:
Закладка: