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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 3 4 5 6 7 8 9 10 11 ... 96

Пример 4-2. Простое присваивание

#!/bin/bash

# Явные переменные

echo

# Когда перед именем переменной не употребляется символ '$'?

# В операциях присваивания.

# Присваивание

a=879

echo "Значение переменной "a" -- $a."

# Присваивание с помощью ключевого слова 'let'

let a=16+5

echo "Значение переменной "a" теперь стало равным: $a."

echo

# В заголовке цикла 'for' (своего рода неявное присваивание)

echo -n "Значения переменной "a" в цикле: "

for a in 7 8 9 11

do

echo -n "$a "

done

echo

echo

# При использовании инструкции 'read' (тоже одна из разновидностей присваивания)

echo -n "Введите значение переменной "a" "

read a

echo "Значение переменной "a" теперь стало равным: $a."

echo

exit 0

Пример 4-3. Присваивание значений переменным простое и замаскированное

#!/bin/bash

a=23 # Простейший случай

echo $a

b=$a

echo $b

# Теперь немного более сложный вариант (подстановка команд).

a=`echo Hello!` # В переменную 'a' попадает результат работы команды 'echo'

echo $a

# Обратите внимание на восклицательный знак (!) в подстанавливаемой команде

#+ этот вариант не будет работать при наборе в командной строке,

#+ поскольку здесь используется механизм "истории команд" BASH

# Однако, в сценариях, механизм истории команд запрещен.

a=`ls -l` # В переменную 'a' записывается результат работы команды 'ls -l'

echo $a # Кавычки отсутствуют, удаляются лишние пробелы и пустые строки.

echo

echo "$a" # Переменная в кавычках, все пробелы и пустые строки сохраняются.

# (См. главу "Кавычки.")

exit 0

Присваивание переменных с использованием $(...) (более современный метод, по сравнению с обратными кавычками)

# Взято из /etc/rc.d/rc.local

R=$(cat /etc/redhat-release)

arch=$(uname -m)

4.3. Переменные Bash не имеют типа

В отличие от большинства других языков программирования, Bash не производит разделения переменных по "типам". По сути, переменные Bash являются строковыми переменными, но, в зависимости от контекста, Bash допускает целочисленную арифметику с переменными. Определяющим фактором здесь служит содержимое переменных.

Пример 4-4. Целое число или строка?

#!/bin/bash

# int-or-string.sh: Целое число или строка?

a=2334 # Целое число.

let "a += 1"

echo "a = $a " # a = 2335

echo # Все еще целое число.

b=${a/23/BB} # замена "23" на "BB".

# Происходит трансформация числа в строку.

echo "b = $b" # b = BB35

declare -i b # Явное указание типа здесь не поможет.

echo "b = $b" # b = BB35

let "b += 1" # BB35 + 1 =

echo "b = $b" # b = 1

echo

c=BB34

echo "c = $c" # c = BB34

d=${c/BB/23} # замена "BB" на "23".

# Переменная $d становится целочисленной.

echo "d = $d" # d = 2334

let "d += 1" # 2334 + 1 =

echo "d = $d" # d = 2335

echo

# А что происходит с "пустыми" переменными?

e=""

echo "e = $e" # e =

let "e += 1" # Арифметические операции допускают использование "пустых" переменных?

echo "e = $e" # e = 1

echo # "Пустая" переменная становится целочисленной.

# А что происходит с необъявленными переменными?

echo "f = $f" # f =

let "f += 1" # Арифметические операции допустимы?

echo "f = $f" # f = 1

echo # Необъявленная переменная трансформируется в целочисленную.

# Переменные Bash не имеют типов.

exit 0

Отсутствие типов -- это и благословение и проклятие. С одной стороны -- отсутствие типов делает сценарии более гибкими (чтобы повеситься -- достаточно иметь веревку!) и облегчает чтение кода. С другой -- является источником потенциальных ошибок и поощряет привычку к "неряшливому" программированию.

Бремя отслеживания типа той или иной переменной полностью лежит на плечах программиста. Bash не будет делать это за вас!

4.4. Специальные типы переменных

локальные переменные

переменные, область видимости которых ограничена блоком кода или телом функции (см так же локальные переменные в функциях)

переменные окружения

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

В более общем контексте, каждый процесс имеет некоторое "окружение" (среду исполнения), т.е. набор переменных, к которым процесс может обращаться за получением определенной информации. В этом смысле командная оболочка подобна любому другому процессу.

Каждый раз, когда запускается командный интерпретатор, для него создаются переменные, соответствующие переменным окружения. Изменение переменных или добавление новых переменных окружения заставляет оболочку обновить свои переменные, и все дочерние процессы (и команды, исполняемые ею) наследуют это окружение.

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

bash$ eval "`seq 10000 | sed -e 's/.*/export var&=ZZZZZZZZZZZZZZ/'`"

bash$ du

bash: /usr/bin/du: Argument list too long

(Спасибо S. C. за вышеприведенный пример и пояснения.)

Если сценарий изменяет переменные окружения, то они должны "экспортироваться", т.е передаваться окружению, локальному по отношению к сценарию. Эта функция возложена на команду export.

Сценарий может экспортировать переменные только дочернему процессу, т.е. командам и процессам запускаемым из данного сценария. Сценарий, запускаемый из командной строки не может экспортировать переменные "на верх" командной оболочке. Дочерний процесс не может экспортировать переменные родительскому процессу.

---

позиционные параметры

аргументы, передаваемые скрипту из командной строки -- $0, $1, $2, $3..., где $0 -- это название файла сценария, $1 -- это первый аргумент, $2 -- второй, $3 -- третий и так далее[ 13 ]. Аргументы, следующие за $9, должны заключаться в фигурные скобки, например: ${10}, ${11}, ${12}.

Специальные переменные $* и [email protected] содержат все позиционные параметры (аргументы командной строки).

Пример 4-5. Позиционные параметры

#!/bin/bash

# Команда вызова сценария должна содержать по меньшей мере 10 параметров, например

# ./scriptname 1 2 3 4 5 6 7 8 9 10

MINPARAMS=10

echo

echo "Имя файла сценария: "$0"."

# Для текущего каталога добавит ./

echo "Имя файла сценария: "`basename $0`"."

# Добавит путь к имени файла (см. 'basename')

echo

if [ -n "$1" ] # Проверяемая переменная заключена в кавычки.

then

echo "Параметр #1: $1" # необходимы кавычки для экранирования символа #

fi

if [ -n "$2" ]

then

echo "Параметр #2: $2"

fi

if [ -n "$3" ]

then

echo "Параметр #3: $3"

fi

# ...

if [ -n "${10}" ] # Параметры, следующие за $9 должны заключаться в фигурные скобки

then

echo "Параметр #10: ${10}"

fi

echo "-----------------------------------"

echo "Все аргументы командной строки: "$*""

if [ $# -lt "$MINPARAMS" ]

then

echo

echo "Количество аргументов командной строки должно быть не менее $MINPARAMS !"

fi

echo

exit 0

1 ... 3 4 5 6 7 8 9 10 11 ... 96
На этой странице вы можете бесплатно читать книгу Искусство программирования на языке сценариев командной оболочки - Мендель Купер бесплатно.
Похожие на Искусство программирования на языке сценариев командной оболочки - Мендель Купер книги

Оставить комментарий