Выбрать главу

# но при таком объявлении второе измерение массива завуалировано.

}

print_alpha ()

{

local row=0

local index

echo

while [ "$row" -lt "$Rows" ] # Вывод содержимого массива построчно

do

local column=0

while [ "$column" -lt "$Columns" ]

do

let "index = $row * $Rows + $column"

echo -n "${alpha[index]} " # alpha[$row][$column]

let "column += 1"

done

let "row += 1"

echo

done

# Более простой эквивалент:

# echo ${alpha[*]} | xargs -n $Columns

echo

}

filter () # Отфильтровывание отрицательных индексов.

{

echo -n " "

if [[ "$1" -ge 0 && "$1" -lt "$Rows" && "$2" -ge 0 && "$2" -lt "$Columns" ]]

then

let "index = $1 * $Rows + $2"

echo -n " ${alpha[index]}" # alpha[$row][$column]

fi

}

rotate () # Поворот массива на 45 градусов

{

local row

local column

for (( row = Rows; row > -Rows; row-- )) # В обратном порядке.

do

for (( column = 0; column < Columns; column++ ))

do

if [ "$row" -ge 0 ]

then

let "t1 = $column - $row"

let "t2 = $column"

else

let "t1 = $column"

let "t2 = $column + $row"

fi

filter $t1 $t2 # Отфильтровать отрицательный индекс.

done

echo; echo

done

# Поворот массива выполнен на основе примеров (стр. 143-146)

# из книги "Advanced C Programming on the IBM PC", автор Herbert Mayer

# (см. библиографию).

}

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

load_alpha # Инициализация массива.

print_alpha # Вывод на экран.

rotate # Повернуть на 45 градусов против часовой стрелки.

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

# Упражнения:

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

# 1) Сделайте инициализацию и вывод массива на экран

# + более простым и элегантным способом.

#

# 2) Объясните принцип работы функции rotate().

exit 0

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

Более сложный пример эмуляции двумерного массива вы найдете в Пример A-11.

Глава 26. Файлы

сценарии начальной загрузки

Эти файлы содержат объявления псевдонимов и переменных окружения, которые становятся доступны Bash после загрузки и инициализации системы.

/etc/profile

Настройки системы по-умолчанию, главным образом настраивается окружение командной оболочки (все Bourne-подобные оболочки, не только Bash[ 55 ])

/etc/bashrc

функции и псевдонимы Bash

$HOME/.bash_profile

пользовательские настройки окружения Bash, находится в домашнем каталоге у каждого пользователя (локальная копия файла /etc/profile)

$HOME/.bashrc

пользовательский файл инициализации Bash, находится в домашнем каталоге у каждого пользователя (локальная копия файла /etc/bashrc). См. Приложение Gпример файла .bashrc.

Сценарий выхода из системы (logout)

$HOME/.bash_logout

Этот сценарий отрабатывает, когда пользователь выходит из системы.

Глава 27. /dev и /proc

Как правило, Linux или UNIX система имеет два каталога специального назначения: /dev и /proc.

27.1. /dev

Каталог /dev содержит файлы физических устройств, которые могут входить в состав аппаратного обеспечения компьютера[ 56 ]. Каждому из разделов не жестком диске соответствует свой файл-устройство в каталоге /dev, информация о которых может быть получена простой командой df.

bash$ df

Filesystem 1k-blocks Used Available Use%

Mounted on

/dev/hda6 495876 222748 247527 48% /

/dev/hda1 50755 3887 44248 9% /boot

/dev/hda8 367013 13262 334803 4% /home

/dev/hda5 1714416 1123624 503704 70% /usr

Кроме того, каталог /dev содержит loopback-устройства ("петлевые" устройства), например /dev/loop0. С помощью такого устройства можно представить обычный файл как блочное устройство ввода/вывода[ 57 ]. Это позволяет монтировать целые файловые системы, находящиеся в отдельных больших файлах. См. Пример 13-6 и Пример 13-5.

Отдельные псевдоустройства в /dev имеют особое назначение, к таким устройствам можно отнести /dev/null, /dev/zero и /dev/urandom.

27.2. /proc

Фактически, каталог /proc -- это виртуальная файловая система. Файлы, в каталоге /proc, содержат информацию о процессах, о состоянии и конфигурации ядра и системы.

bash$ cat /proc/devices

Character devices:

1 mem

2 pty

3 ttyp

4 ttyS

5 cua

7 vcs

10 misc

14 sound

29 fb

36 netlink

128 ptm

136 pts

162 raw

254 pcmcia

Block devices:

1 ramdisk

2 fd

3 ide0

9 md

bash$ cat /proc/interrupts

CPU0

вернуться

55

Это не относится к таким оболочкам, как csh, tcsh и другим, которые не являются производными от классической Bourne shell (sh).

вернуться

56

Каталог /dev содержит специальные файлы -- точки монтирования физических и виртуальных устройств. Они занимают незначительное пространство на диске.

Некоторые из устройств, такие как /dev/null, /dev/zero или /dev/urandom -- являются виртуальными. Они не являются файлами физических устройств, система эмулирует эти устройства программным способом.

вернуться

57

Блочное устройство читает и/или пишет данные целыми блоками, в отличие от символьных устройств, которые читают и/или пишут данные по одному символу. Примером блочного устройства может служить жесткий диск, CD-ROM. Примером символьного устройства -- клавиатура.