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

стр.

if [ -z $1 ]

then

exit $POS_PARAMS_MISSING

fi

---

Пример 4-6. wh, whois выяснение имени домена

#!/bin/bash


# Команда 'whois domain-name' выясняет имя домена на одном из 3 серверов:

# ripe.net, cw.net, radb.net


# Разместите этот скрипт под именем 'wh' в каталоге /usr/local/bin


# Требуемые символические ссылки:

# ln -s /usr/local/bin/wh /usr/local/bin/wh-ripe

# ln -s /usr/local/bin/wh /usr/local/bin/wh-cw

# ln -s /usr/local/bin/wh /usr/local/bin/wh-radb


if [ -z "$1" ]

then

echo "Порядок использования: `basename $0` [domain-name]"

exit 65

fi


case `basename $0` in

# Проверка имени скрипта и, соответственно, имени сервера

"wh" ) whois $1@whois.ripe.net;;

"wh-ripe") whois $1@whois.ripe.net;;

"wh-radb") whois $1@whois.radb.net;;

"wh-cw" ) whois $1@whois.cw.net;;

* ) echo "Порядок использования: `basename $0` [domain-name]";;

esac


exit 0

---

Команда shift "сдвигает" позиционные параметры, в результате чего парметры "сдвигаются" на одну позицию влево.

$1 <--- $2, $2 <--- $3, $3 <--- $4, и т.д.

Прежний аргумент $1 теряется, но аргумент $0 (имя файла сценария) остается без изменений. Если вашему сценарию передается большое количество входных аргументов, то команда shift позволит вам получить доступ к аргументам, с порядковым номером больше 9, без использования {фигурных скобок}.

Пример 4-7. Использование команды shift

#!/bin/bash

# Использование команды 'shift' с целью перебора всех аргументов командной строки.


# Назовите файл с этим сценарием, например "shft",

#+ и вызовите его с набором аргументов, например:

# ./shft a b c def 23 skidoo


until [ -z "$1" ] # До тех пор пока не будут разобраны все входные аргументы...

do

echo -n "$1 "

shift

done


echo # Дополнительная пустая строка.


exit 0

Команда shift может применяться и к входным аргументам функций. См. Пример 33-10.


Глава 5. Кавычки

Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке. (Символ называется "специальным", если он несет дополнительную смысловую нагрузку, например символ шаблона -- *.)

bash$ ls -l [Vv]*

-rw-rw-r-- 1 bozo bozo 324 Apr 2 15:05 VIEWDATA.BAT

-rw-rw-r-- 1 bozo bozo 507 May 4 14:25 vartrace.sh

-rw-rw-r-- 1 bozo bozo 539 Apr 14 17:11 viewdata.sh


bash$ ls -l '[Vv]*'

ls: [Vv]*: No such file or directory


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

bash$ grep '[Пп]ервая' *.txt

file1.txt:Это первая строка в file1.txt.

file2.txt:Это Первая строка в file2.txt.


Примечательно, что "не окавыченный" вариант команды grep [Пп]ервая *.txt будет правильно исполняться в Bash, но не в tcsh.

Вообще, желательно использовать двойные кавычки (" ") при обращении к переменным. Это предотвратит интерпретацию специальных символов, которые могут содержаться в именах переменных, за исключением $, ` (обратная кавычка) и \ (escape -- обратный слэш)[ 14 ]. То, что символ $ попал в разряд исключений, позволяет выполнять обращение к переменным внутри строк, ограниченных двойными кавычками ("$variable"), т.е. выполнять подстановку значений переменных (см. Пример 4-1, выше).

Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова[ 15 ]. Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы - разделители.

variable1="a variable containing five words"

COMMAND This is $variable1 # Исполнение COMMAND с 7 входными аргументами:

# "This" "is" "a" "variable" "containing" "five" "words"


COMMAND "This is $variable1" # Исполнение COMMAND с одним входным аргументом:

# "This is a variable containing five words"


variable2="" # Пустая переменная.


COMMAND $variable2 $variable2 $variable2 # Исполнение COMMAND без аргументов.

COMMAND "$variable2" "$variable2" "$variable2" # Исполнение COMMAND с 3 "пустыми" аргументами.