В коммерческих версиях UNIX, сценарии, использующие GNU-версии стандартных утилит и команд, могут оказаться неработоспособными. Однако, с течением времени, таких проблем остается все меньше и меньше, поскольку утилиты GNU, в большинстве своем, заместили свои проприетарные аналоги в UNIX. После того, как Caldera дала разрешение на публикацию исходного кода некоторых версий оригинальных утилит UNIX, этот процесс значительно ускорился.
Bash имеет некоторые особенности, недоступные в традиционном Bourne shell. Среди них:
Некоторые дополнительные ключи вызова
Подстановка команд, с использованием нотации $( )
Некоторые операции над строками
Подстановка процессов
встроенные команды Bash
Более подробный список характерных особенностей Bash, вы найдете в Bash F.A.Q..
33.10. Сценарии командной оболочки под Windows
Даже те пользователи, которые работают в другой , не UNIX-подобной операционной системе, смогут запускать сценарии командной оболочки, а потому -- найти для себя много полезного в этой книге. Пакеты Cygwin от Cygnus, и MKS utilities от Mortice Kern Associates, позволяют дополнить Windows возможностями командной оболочки.
Текущая версия Bash , та, которая скорее всего установлена в вашей системе, фактически -- 2.XX.Y.
bash$ echo $BASH_VERSION
2.05.8(1)-release
В этой версии классического языка сценариев Bash были добавлены переменные-массивы [ 64 ] Chet Ramey обещал ввести в Bash ассоциативные массивы (они хорошо знакомы программистам, работающим с языком Perl) в одном из следующих релизов Bash.
, расширение строк и подстановка параметров, улучшен метод косвенных ссылок на переменные.
Пример 34-1. Расширение строк
#!/bin/bash
# "Расширение" строк (String expansion).
# Введено в Bash, начиная с версии 2.
# Строки вида $'xxx'
# могут содержать дополнительные экранированные символы.
echo $'Звонок звенит 3 раза \a \a \a'
echo $'Три перевода формата \f \f \f'
echo $'10 новых строк \n\n\n\n\n\n\n\n\n\n'
exit 0
Пример 34-2. Косвенные ссылки на переменные -- новый метод
#!/bin/bash
# Косвенные ссылки на переменные.
a=letter_of_alphabet
letter_of_alphabet=z
echo "a = $a" # Прямая ссылка.
echo "Now a = ${!a}" # Косвенная ссылка.
# Форма записи ${!variable} намного удобнее старой "eval var1=\$$var2"
echo
t=table_cell_3
table_cell_3=24
echo "t = ${!t}" # t = 24
table_cell_3=387
echo "Значение переменной t изменилось на ${!t}" # 387
# Теперь их можно использовать для ссылок на элементы массива,
# или для эмуляции многомерных массивов.
# Было бы здорово, если бы косвенные ссылки допускали индексацию.
exit 0
Пример 34-3. Простая база данных, с применением косвенных ссылок
#!/bin/bash
# resistor-inventory.sh
# Простая база данных, с применением косвенных ссылок.
# ============================================================== #
# Данные
B1723_value=470 # сопротивление (Ом)
B1723_powerdissip=.25 # рассеиваемая мощность (Вт)
B1723_colorcode="желтый-фиолетовый-коричневый" # цветовая маркировка
B1723_loc=173 # где
B1723_inventory=78 # количество (шт)
B1724_value=1000
B1724_powerdissip=.25
B1724_colorcode="коричневый-черный-красный"
B1724_loc=24N
B1724_inventory=243
B1725_value=10000
B1725_powerdissip=.25
B1725_colorcode="коричневый-черный-оранжевый"
B1725_loc=24N
B1725_inventory=89
# ============================================================== #
echo
PS3='Введите ноиер: '
echo
select catalog_number in "B1723" "B1724" "B1725"
do
Inv=${catalog_number}_inventory
Val=${catalog_number}_value
Pdissip=${catalog_number}_powerdissip
Loc=${catalog_number}_loc
Ccode=${catalog_number}_colorcode
echo
echo "Номер по каталогу $catalog_number:"
echo "Имеется в наличии ${!Inv} шт. [${!Val} Ом / ${!Pdissip} Вт]."
echo "Находятся в лотке # ${!Loc}."
echo "Цветовая маркировка: \"${!Ccode}\"."
break
done
echo; echo
# Упражнение:
# ----------
# Переделайте этот сценарий так, чтобы он использовал массивы вместо косвенных ссылок.
# Какой из вариантов более простой и интуитивный?
# Примечание:
# ----------
# Язык командной оболочки не очень удобен для написания приложений,
#+ работающих с базами данных.
# Для этой цели лучше использовать языки программирования, имеющие
#+ развитые средства для работы со структурами данных,
#+ такие как C++ или Java (может быть Perl).
exit 0
Пример 34-4. Массивы и другие хитрости для раздачи колоды карт в четыре руки
#!/bin/bash
# На старых системах может потребоваться вставить #!/bin/bash2.
# Карты:
# раздача в четыре руки.
UNPICKED=0
PICKED=1
DUPE_CARD=99
LOWER_LIMIT=0
UPPER_LIMIT=51
CARDS_IN_SUIT=13
CARDS=52
declare -a Deck
declare -a Suits
declare -a Cards
# Проще и понятнее было бы, имей мы дело
Читать дальше