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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 24 25 26 27 28 29 30 31 32 ... 96

# Обратите внимание на ${0##*/} это подстановка параметра ${var##pattern}. В результате получается $0.

-*) FILENAME=./$1;; # Если имя файла (аргумент $1) начинается с "-",

# то заменить его на ./$1

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

* ) FILENAME=$1;; # В противном случае -- $1.

esac

Пример 10-26. Оператор case допускает использовать подстановку команд вместо анализируемой переменной

#!/bin/bash

# Подстановка команд в "case".

case $( arch ) in # команда "arch" возвращает строку, описывающую аппаратную апхитектуру.

i386 ) echo "Машина на базе процессора 80386";;

i486 ) echo "Машина на базе процессора 80486";;

i586 ) echo "Машина на базе процессора Pentium";;

i686 ) echo "Машина на базе процессора Pentium2 или выше";;

* ) echo "Машина на другом типе процессора";;

esac

exit 0

Оператор case допускает использование шаблонных конструкций.

Пример 10-27. Простой пример сравнения строк

#!/bin/bash

# match-string.sh: простое сравнение строк

match_string ()

{

MATCH=0

NOMATCH=90

PARAMS=2 # Функция требует два входных аргумента.

BAD_PARAMS=91

[ $# -eq $PARAMS ] || return $BAD_PARAMS

case "$1" in

"$2") return $MATCH;;

* ) return $NOMATCH;;

esac

}

a=one

b=two

c=three

d=two

match_string $a # неверное число аргументов

echo $? # 91

match_string $a $b # не равны

echo $? # 90

match_string $b $d # равны

echo $? # 0

exit 0

Пример 10-28. Проверка ввода

#!/bin/bash

# isalpha.sh: Использование "case" для анализа строк.

SUCCESS=0

FAILURE=-1

isalpha () # Проверка - является ли первый символ строки символом алфавита.

{

if [ -z "$1" ] # Вызов функции без входного аргумента?

then

return $FAILURE

fi

case "$1" in

[a-zA-Z]*) return $SUCCESS;; # Первый символ - буква?

* ) return $FAILURE;;

esac

} # Сравните с функцией "isalpha ()" в языке C.

isalpha2 () # Проверка - состоит ли вся строка только из символов алфавита.

{

[ $# -eq 1 ] || return $FAILURE

case $1 in

*[!a-zA-Z]*|"") return $FAILURE;;

*) return $SUCCESS;;

esac

}

isdigit () # Проверка - состоит ли вся строка только из цифр.

{ # Другими словами - является ли строка целым числом.

[ $# -eq 1 ] || return $FAILURE

case $1 in

*[!0-9]*|"") return $FAILURE;;

*) return $SUCCESS;;

esac

}

check_var () # Интерфейс к isalpha

{

if isalpha "[email protected]"

then

echo ""$*" начинается с алфавитного символа."

if isalpha2 "[email protected]"

then # Дальнейшая проверка не имеет смысла, если первй символ не буква.

echo ""$*" содержит только алфавитные символы."

else

echo ""$*" содержит по меньшей мере один не алфавитный символ."

fi

else

echo ""$*" начинсется с не алфавитного символа ."

# Если функция вызвана без входного параметра,

#+ то считается, что строка содержит "не алфавитной" символ.

fi

echo

}

digit_check () # Интерфейс к isdigit ().

{

if isdigit "[email protected]"

then

echo ""$*" содержит только цифры [0 - 9]."

else

echo ""$*" содержит по меньшей мере один не цифровой символ."

fi

echo

}

a=23skidoo

b=H3llo

c=-What?

d=What?

e=`echo $b` # Подстановка команды.

f=AbcDef

g=27234

h=27a34

i=27.34

check_var $a

check_var $b

check_var $c

check_var $d

check_var $e

check_var $f

check_var # Вызов без параметра, что произойдет?

#

digit_check $g

digit_check $h

digit_check $i

exit 0 # Сценарий дополнен S.C.

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

# --------

# Напишите функцию 'isfloat ()', которая проверяла бы вещественные числа.

# Подсказка: Эта функция подобна функции 'isdigit ()',

#+ надо лишь добавить анализ наличия десятичной точки.

select

Оператор select был заимствован из Korn Shell, и является еще одним инструментом, используемым при создании меню.

select variable [in list] do command... break done

Этот оператор предлагает пользователю выбрать один из представленных вариантов. Примечательно, что select по-умолчанию использует в качестве приглашения к вводу (prompt) -- PS3 (#? ), который легко изменить.

Пример 10-29. Создание меню с помощью select

#!/bin/bash

PS3='Выберите ваш любимый овощ: ' # строка приглашения к вводу (prompt)

echo

select vegetable in "бобы" "морковь" "картофель" "лук" "брюква"

do

echo

echo "Вы предпочитаете $vegetable."

echo ";-))"

echo

break # если 'break' убрать, то получится бесконечный цикл.

done

exit 0

Если в операторе select список in list не задан, то в качестве списка будет использоваться список аргументов ([email protected]), передаваемый сценарию или функции.

Сравните это с поведением оператора цикла

for variable [in list]

в котором не задан список аргументов.

Пример 10-30. Создание меню с помощью select в функции

#!/bin/bash

PS3='Выберите ваш любимый овощ: '

echo

choice_of()

{

select vegetable

# список выбора [in list] отсутствует, поэтому 'select' использует входные аргументы функции.

do

echo

echo "Вы предпочитаете $vegetable."

echo ";-))"

echo

break

done

}

choice_of бобы рис морковь редис томат шпинат

# $1 $2 $3 $4 $5 $6

# передача списка выбора в функцию choice_of()

exit 0

См. так же Пример 34-3.

Глава 11. Внутренние команды

Внутренняя команда -- это команда, которая встроена непосредственно в Bash. Команды делаются встроенными либо из соображений производительности -- встроенные команды исполняются быстрее, чем внешние, которые, как правило, запускаются в дочернем процессе, либо из-за необходимости прямого доступа к внутренним структурам командного интерпретатора.

Действие, когда какая либо команда или сама командная оболочка инициирует (порождает) новый подпроцесс, что бы выполнить какую либо работу, называется ветвлением (forking) процесса. Новый процесс называется "дочерним" (или "потомком"), а породивший его процесс -- "родительским" (или "предком"). В результате и потомок и предок продолжают исполняться одновременно -- параллельно друг другу.

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

Внутренние команды могут иметь внешние аналоги. Например, внутренняя команда Bash -- echo имеет внешний аналог /bin/echo и их поведение практически идентично.

#!/bin/bash

echo "Эта строка выводится внутренней командой "echo"."

/bin/echo "А эта строка выводится внешней командой the /bin/echo."

Ключевое слово (keyword) -- это зарезервированное слово, синтаксический элемент (token) или оператор. Ключевые слова имеют специальное назначение для командного интерпретатора, и фактически являются элементами синтаксиса языка командной оболочки. В качестве примера можно привести "for", "while", "do", "!", которые являются ключевыми (или зарезервированными) словами. Подобно встроенным командам, ключевые слова жестко зашиты в Bash, но в отличие от встроенных команд, ключевые слова не являются командами как таковыми, хотя при этом могут являться их составной частью[ 24 ].

1 ... 24 25 26 27 28 29 30 31 32 ... 96
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Искусство программирования на языке сценариев командной оболочки - Мендель Купер.
Книги, аналогичгные Искусство программирования на языке сценариев командной оболочки - Мендель Купер

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