Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

directory=/usr/X11R6/bin/

prefix=mk* # Определить -- не будет ли проблем с шаблонами.

echo "Переменные \"directory\" + \"prefix\" = $directory$prefix"

echo

alias lll="ls -l $directory$prefix"

echo "Попытка обращения к псевдониму \"lll\":"

lll # Список всех файлов в /usr/X11R6/bin, чьи имена начинаются с mk.

# Псевдонимы могут работать с шаблонами.

TRUE=1

echo

if [ TRUE ]

then

alias rr="ls -l"

echo "Попытка

обращения к псевдониму \"rr\", созданному внутри if/then:"

rr /usr/X11R6/bin/mk* #* В результате -- сообщение об ошибке!

# К псевдонимам, созданным внутри составных инструкций, нельзя обратиться.

echo "Однако, ранее созданный псевдоним остается работоспособным:"

ll /usr/X11R6/bin/mk*

fi

echo

count=0

while [ $count -lt 3 ]

do

alias rrr="ls -l"

echo "Попытка обращения к псевдониму \"rrr\", созданному внутри цикла \"while\":"

rrr /usr/X11R6/bin/mk* #* Так же возникает ошибка.

# alias.sh: line 57: rrr: command not found

let count+=1

done

echo; echo

alias xyz='cat $0' # Сценарий печатает себя самого.

# Обратите внимание на "строгие" кавычки.

xyz

# Похоже работает,

#+ хотя документация Bash утверждает, что такой псевдоним не должен работать.

#

# Steve Jacobson отметил, что

#+ параметр "$0" интерпретируется непосредственно, во время объявления псевдонима.

exit 0

Команда unalias удаляет псевдоним, объявленный ранее .

Пример 23-2. unalias: Объявление и удаление псевдонимов

#!/bin/bash

shopt -s expand_aliases # Разрешить "разворачивание" псевдонимов.

alias llm='ls -al | more'

llm

echo

unalias llm # Удалить псевдоним.

llm

# Сообщение об ошибке, т.к. команда 'llm' больше не распознается.

exit 0

bash$ ./unalias.sh

total 6

drwxrwxr-x 2 bozo bozo 3072 Feb 6 14:04 .

drwxr-xr-x 40 bozo bozo 2048 Feb 6 14:04 ..

– rwxr-xr-x 1 bozo bozo 199 Feb 6 14:04 unalias.sh

./unalias.sh: llm: command not found

Глава 24. Списки команд

Средством обработки последовательности из нескольких команд служат списки: "И-списки" и "ИЛИ-списки". Они эффективно могут заменить сложную последовательность вложенных if/then или даже case.

Объединение команд в цепочки

И-список

command-1 && command-2 && command-3 && ... command-n

Каждая

последующая команда, в таком списке, выполняется только тогда, когда предыдущая команда вернула код завершения true (ноль). Если какая-либо из команд возвращает false (не ноль), то исполнение списка команд в этом месте завершается, т.е. следующие далее команды не выполняются.

Пример 24-1. Проверка аргументов командной строки с помощью "И-списка"

#!/bin/bash

# "И-список"

if [ !
– z "$1" ] && echo "Аргумент #1 = $1" && [ !
– z "$2" ] && echo "Аргумент #2 = $2"

then

echo "Сценарию передано не менее 2 аргументов."

# Все команды в цепочке возвращают true.

else

echo "Сценарию передано менее 2 аргументов."

# Одна из команд в списке вернула false.

fi

# Обратите внимание: "if [ !
– z $1 ]" тоже работает, но, казалось бы эквивалентный вариант

# if [ -n $1 ] -- нет. Однако, если добавить кавычки

# if [ -n "$1" ] то все работает. Будьте внимательны!

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

# То же самое, только без списка команд.

if [ !
– z "$1" ]

then

echo "Аргумент #1 = $1"

fi

if [ !
– z "$2" ]

then

echo "Аргумент #2 = $2"

echo "Сценарию передано не менее 2 аргументов."

else

echo "Сценарию передано менее 2 аргументов."

fi

# Получилось менее элегантно и длиннее, чем с использованием "И-списка".

exit 0

Пример 24-2. Еще один пример проверки аргументов с помощью "И-списков"

#!/bin/bash

ARGS=1 # Ожидаемое число аргументов.

E_BADARGS=65 # Код завершения, если число аргументов меньше ожидаемого.

test $# -ne $ARGS && echo "Порядок использования: `basename $0` $ARGS аргумент(а)(ов)" && exit $E_BADARGS

# Если проверка первого условия возвращает true (неверное число аргументов),

# то исполняется остальная часть строки, и сценарий завершается.

# Строка ниже выполняется только тогда, когда проверка выше не проходит.

# обратите внимание на условие "-ne" -- "не равно" (прим. перев.)

echo "Сценарию передано корректное число аргументов."

exit 0

# Проверьте код завершения сценария командой "echo $?".

Конечно же, с помощью И-списка можно присваивать переменным значения по-умолчанию.

arg1=$@ # В $arg1 записать аргументы командной строки.

[ -z "$arg1" ] && arg1=DEFAULT

# Записать DEFAULT, если аргументы командной строки отсутствуют.

ИЛИ-список

command-1 || command-2 || command-3 || ... command-n

Поделиться с друзьями: