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

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

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

# random2.sh: Генерация псевдослучайных чисел в диапазоне 0 - 1.

# Используется функция rand() из awk.


AWKSCRIPT=' { srand(); print rand() } '

# Команды/параметры, передаваемые awk

# Обратите внимание, функция srand() переустанавливает начальное число генератора случайных чисел.


echo -n "Случайное число в диапазоне от 0 до 1 = "

echo | awk "$AWKSCRIPT"


exit 0


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

# ---------


# 1) С помощью оператора цикла выведите 10 различных случайных чисел.

# (Подсказка: вам потребуется вызвать функцию "srand()"

# в каждом цикле с разными начальными числами.

# Что произойдет, если этого не сделать?)


# 2) Заставьте сценарий генерировать случайные числа в диапазоне 10 - 100

# используя целочисленный множитель, как коэффициент масштабирования


# 3) То же самое, что и во втором упражнении,

# но на этот раз случайные числа должны быть целыми.


9.7. Двойные круглые скобки

Эта конструкция во многом похожа на инструкцию let, внутри ((...)) вычисляются арифметические выражения и возвращается их результат. В простейшем случае, конструкция a=$(( 5 + 3 )) присвоит переменной "a" значение выражения "5 + 3", или 8. Но, кроме того, двойные круглые скобки позволяют работать с переменными в стиле языка C.

Пример 9-28. Работа с переменными в стиле языка C

#!/bin/bash

# Работа с переменными в стиле языка C.


echo


(( a = 23 )) # Присвоение переменной в стиле C, с обоих строн от "=" стоят пробелы.

echo "a (начальное значение) = $a"


(( a++ )) # Пост-инкремент 'a', в стиле C.

echo "a (после a++) = $a"


(( a-- )) # Пост-декремент 'a', в стиле C.

echo "a (после a--) = $a"


(( ++a )) # Пред-инкремент 'a', в стиле C.

echo "a (после ++a) = $a"


(( --a )) # Пред-декремент 'a', в стиле C.

echo "a (после --a) = $a"


echo


(( t = a<45?7:11 )) # Трехместный оператор в стиле языка C.

echo "If a < 45, then t = 7, else t = 11."

echo "t = $t " # Да!


echo


# См. так же описание ((...)) в циклах "for" и "while".


# Эта конструкция доступна в Bash, начиная с версии 2.04.


exit 0

См. так же Пример 10-12.


Глава 10. Циклы и ветвления

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


10.1. Циклы

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

циклы for

for (in)

Это одна из основных разновидностей циклов. И она значительно отличается от аналога в языке C.

for arg in [list] do команда(ы)... done


На каждом проходе цикла, переменная-аргумент цикла arg последовательно, одно за другим, принимает значения из списка list.

for arg in "$var1" "$var2" "$var3" ... "$varN"

# На первом проходе, $arg = $var1

# На втором проходе, $arg = $var2

# На третьем проходе, $arg = $var3

# ...

# На N-ном проходе, $arg = $varN


# Элементы списка заключены в кавычки для того, чтобы предотвратить возможное разбиение их на отдельные аргументы (слова).


Элементы списка могут включать в себя шаблонные символы.

Есл ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.

for arg in [list] ; do


Пример 10-1. Простой цикл for

#!/bin/bash

# Список планет.


for planet in Меркурий Венера Земля Марс Юпитер Сатурн Уран Нептун Плутон

do

echo $planet

done


echo


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

for planet in "Меркурий Венера Земля Марс Юпитер Сатурн Уран Нептун Плутон"

do

echo $planet

done


exit 0

Каждый из элементов [списка] может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в списке, необходимо использовать инструкцию set (см. Пример 11-13).

Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка

#!/bin/bash

# Список планет.


# Имя кажой планеты ассоциировано с расстоянием от планеты до Солнца (млн. миль).


for planet in "Меркурий 36" "Венера 67" "Земля 93" "Марс 142" "Юпитер 483"

do

set -- $planet # Разбиение переменной "planet" на множество аргументов (позиционных параметров).

# Конструкция "--" предохраняет от неожиданностей, если $planet "пуста" или начинается с символа "-".


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

# То можно поместить их в массив,

# original_params=(" [email protected]")


echo "$1 в $2,000,000 миль от Солнца"

#----две табуляции---к параметру $2 добавлены нули

done


# (Спасибо S.C., за разъяснения.)


exit 0

В качестве списка, в цикле for, можно использовать переменную.

Пример 10-3. Fileinfo: обработка списка файлов, находящегося в переменной

#!/bin/bash

# fileinfo.sh


FILES="/usr/sbin/privatepw

/usr/sbin/pwck

/usr/sbin/go500gw

/usr/bin/fakefile

/sbin/mkreiserfs

/sbin/ypbind" # Список интересующих нас файлов.

# В список добавлен фиктивный файл /usr/bin/fakefile.


echo


for file in $FILES

do


if [ ! -e "$file" ] # Проверка наличия файла.

then

echo "Файл $file не найден."; echo

continue # Переход к следующей итерации.

fi


ls -l $file | awk '{ print $8 " размер: " $5 }' # Печать 2 полей.

whatis `basename $file` # Информация о файле.

echo

done


exit 0

В [списке] цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны.

Пример 10-4. Обработка списка файлов в цикле for

#!/bin/bash

# list-glob.sh: Создание список файлов в цикле for с использованием

# операции подстановки имен файлов ("globbing").


echo


for file in *

do

ls -l "$file" # Список всех файлов в $PWD (текущем каталоге).

# Напоминаю, что символу "*" соответствует любое имя файла,

# однако, в операциях подстановки имен файлов ("globbing"),

# имеются исключения -- имена файлов, начинающиеся с точки.


# Если в каталоге нет ни одного файла, соответствующего шаблону,

# то за имя файла принимается сам шаблон.

# Чтобы избежать этого, используйте ключ nullglob

# (shopt -s nullglob).

# Спасибо S.C.

done


echo; echo


for file in [jx]*

do

rm -f $file # Удаление файлов, начинающихся с "j" или "x" в $PWD.

echo "Удален файл "$file"".

done


echo


exit 0

Если [список] в цикле for не задан, то в качестве оного используется переменная [email protected] -- список аргументов командной строки. Оень остроумно эта особенность проиллюстрирована в Пример A-18.

Пример 10-5. Цикл for без списка аргументов

#!/bin/bash


# Попробуйте вызвать этот сценарий с аргументами и без них и посмотреть на результаты.


for a

do

echo -n "$a "

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